数据结构:栈和队列详解(上)

server/2025/1/21 16:27:50/

一.栈

1.概念与结构:

栈:一种特殊的线性表,只允许在顺序表的一段插入和删除数据,进行插入和删除的一端叫做栈顶,另外一端则叫做栈底,而我们将在栈顶插入数据叫做压栈(入栈或进栈),在栈底删除数据则叫做出栈

栈的实现可以通过链表和数组实现,但数组在尾插时相对于需要遍历链表才能尾插的链表结构而言拥有更小的时间复杂度,所以栈的实现一般使用数组实现

2.栈的实现:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>//定义栈的结构
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int top;      //指向栈顶的位置int capacity;//栈的容量
}ST;//栈的初始化
void STInit(ST* ps);
//栈的销毁
void STDestory(ST* ps);
//入栈
void StackPush(ST* ps, STDataType x);
//判断栈是否为空(配合确定top--至0(栈底)的限制条件)
bool StackEmpty(ST* ps);
//出栈
void StackPop(ST* ps);
//取栈顶数据
STDataType StackTop(ST* ps);
//获取栈中有效元素个数
STDataType STsize(ST* ps);
//栈的初始化
void STInit(ST* ps)
{ps->arr = NULL;ps->capacity = ps->top = 0;
}
//栈的销毁
void STDestory(ST*ps)
{if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->capacity = ps->top = 0;
}
//入栈
void StackPush(ST* ps, STDataType x)
{assert(ps);//空间不够if (ps->capacity == ps->top){//扩容STDataType newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc failed");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}//空间足够ps->arr[ps->top++] = x;ps->capacity++;
}
//判断栈是否为空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}
//出栈
void StackPop(ST* ps)
{assert(!StackEmpty(ps));--ps->top;--ps->capacity;
}
//获取栈顶元素
STDataType StackTop(ST* ps)
{assert(!StackEmpty(ps));return ps->arr[ps->top-1];
}
//获取栈中元素个数
STDataType STsize(ST* ps)
{assert(ps);return ps->top;
}

以上是栈的实现中所有涉及的函数及函数实现

3.与栈有关的算法题(有效的括号):

原题来源:https://leetcode.cn/problems/valid-parentheses/description/

这题的主要思路就是通过创建一个栈,然后在对输入的一串字符串进行遍历入栈,首先是使其中的一个栈的入栈条件为”是左括号“,如果遍历出的下一个是与之对应的右括号,则使先前入栈的左括号出栈,以此类推,直至字符串遍历完成,如果此时栈为空,则说明字符串符符合题意并且返回true,若不为空,则返回false,整体来看,代码总体上会以字符串的遍历以及栈的输入输出为整体架构,并且伴随着对特殊情况1:”空栈“特殊情况2:”字符串遍历完后栈中是否还有元素残留“的讨论,前者应当置于字符串遍历过程中字符元素与栈元素的对比之前,因为对比就意味着要从栈里读取元素,而空栈是无法读取的,后者则应当置于尾部,在对比机制完整之后以防止”【】{“(类似这种情况)的产生,同时还有一点值得注意的就是每次排除一种错误情况时都不要忘记销毁栈(因为栈的插入涉及到对空间的申请,而不及时释放空间就很容易产生内存泄漏问题)


//栈的初始化
void STInit(ST* ps)
{ps->arr = NULL;ps->capacity = ps->top = 0;
}
//栈的销毁
void STDestory(ST* ps)
{if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->capacity = ps->top = 0;
}
//入栈
void StackPush(ST* ps, STDataType x)
{assert(ps);//空间不够if (ps->capacity == ps->top){//扩容int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc failed");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}//空间足够ps->arr[ps->top++] = x;ps->capacity++;
}
//判断栈是否为空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}
//出栈
void StackPop(ST* ps)
{assert(!StackEmpty(ps));--ps->top;--ps->capacity;
}
//获取栈顶元素
char StackTop(ST* ps)
{assert(!StackEmpty(ps));return ps->arr[ps->top - 1];
}
//获取栈中元素个数
int STsize(ST* ps)
{assert(ps);return ps->top;
}bool isValid(char* s) {
ST st;
STInit(&st);
char* pi = s;
//遍历字符串
while (*pi != '\0')
{//左括号入栈if (*pi == '{' || *pi == '[' || *pi == '('){StackPush(&st, *pi);}else{//右括号取栈顶并匹配//先判断是否为空if (StackEmpty(&st)){STDestory(&st);return false;}char tmp = StackTop(&st);if (tmp == '{' && *pi! = '}' || tmp == '(' && *pi! = ')' || tmp == '[' && *pi! = ']'){STDestory(&st);return false;}StackPop(&st);}pi++;
}
//如果栈为空,说明所有的括号都匹配完了,反之为非有效字符串
bool ret = StackEmpty(&st) ? true : false;
STDestory(&st);
return ret;
}


http://www.ppmy.cn/server/160226.html

相关文章

HTML<bdo>标签

例子 指定文本方向&#xff1a; <bdo dir"rtl"> This text will go right-to-left. </bdo> <!DOCTYPE html> <html> <body> <h1>The bdo element</h1> <p>This paragraph will go left-to-right.</p> …

C#操作Xml节点

见过不少人、经过不少事、也吃过不少苦&#xff0c;感悟世事无常、人心多变&#xff0c;靠着回忆将往事串珠成链&#xff0c;聊聊感情、谈谈发展&#xff0c;我慢慢写、你一点一点看...... 1、增加节点 public static bool AppendChild(string filePath, string xPath, XmlNod…

FPGA:Quartus软件与操作系统版本对照表

文章目录 1.软件概述2.软件版本3.设计流程4.支持的设备5.新特性6.版本对照 1.软件概述 Quartus软件是由英特尔&#xff08;Intel&#xff09;公司开发的一款功能强大的FPGA&#xff08;现场可编程逻辑门阵列&#xff09;设计工具&#xff0c;广泛应用于数字电路设计、仿真、综…

类和对象(3)——继承:extends关键字、super关键字、protected关键字、final关键字

目录 1. 继承 1.1 继承的概念 1.2 extends关键字 1.3 继承方式 2.继承类的成员访问 2.1 成员变量 2.2 成员方法 3. super关键字 4. super、this 与 构造方法 4.1 子类中的super()调用 4.1.1 父类只有无参构造方法 4.1.2 父类有带参构造方法时 4.2 super 与 this 的…

牛客周赛Round 76 F同位序列

F-同位序列_牛客周赛 Round 76 Round76比较简单&#xff0c;最后一题不涉及到什么算法&#xff0c;就是道模拟题&#xff0c;wa了几发最后还是让我混过去了&#x1f92d;。其实就是一个规律&#xff1a;将整数二进制中第一次出现零的位置pos0且在这个位置之前出现了1(位置为pos…

AI发展困境:技术路径与实践约束的博弈

标题&#xff1a;AI发展困境&#xff1a;技术路径与实践约束的博弈 文章信息摘要&#xff1a; AI技术发展路径主要受实践约束驱动&#xff0c;而非纯理论优势。大型AI实验室的成功更依赖优质执行力和资源优势&#xff0c;而非独特技术创新。当前AI发展面临评估体系与实际应用脱…

Spring Cloud 微服务

一、什么是微服务&#xff1f; 先说说什么是微服务。想象一下&#xff0c;你有一个超大的乐高积木&#xff0c;里面有很多小零件&#xff0c;每个小零件都有自己的功能。要是其中一个零件坏了&#xff0c;你只需要换掉那个小零件&#xff0c;而不用把整个乐高都扔掉。微服务就…

腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发

腾讯云AI代码助手评测&#xff1a;如何智能高效完成Go语言Web项目开发 ?? 文章目录 腾讯云AI代码助手评测&#xff1a;如何智能高效完成Go语言Web项目开发 ?? 背景引言开发环境介绍腾讯云AI代码助手使用实例 1. 代码补全2. 技术对话3. 代码优化4. 规范代码5. Bug处理 获得…