初步认识栈
内容概述:先列举栈的来源框架结构,再开始介绍栈的一些基本知识点,继而说明顺序存储结构和链式存储结构,最后提到应用。
- 前文之前提到的线性表进行一定的操作受限就形成了栈和队列,其逻辑结构是属于线性结构,存储结构可通过顺序存储和链式存储实现。栈的出现是为了解决某些特定情形下的结构运算。具体可看下面的应用部分。
基本概念
栈是指只允许在一端进行插入或删除操作的线性表。因而它的操作受限是指只能在某一端进行插入和删除操作,因而栈的一个明显特性可以概括为后进先出(LIFO)。栈又可称为后进先出线性表。
下面是栈的一些专业名词解释:
名称 | 解释 |
---|---|
栈顶 | 线性表允许进行插入和删除的那一端 |
栈底 | 固定的,不允许进行插入和删除的另一端 |
空栈 | 不含任何元素的空表 |
基本操作
函数名称 | 作用 |
---|---|
InitStack(&S) | 初始化一个空栈S |
StackEmpty(S) | 判断一个栈是否为空,若栈为空则返回true,否则返回false |
Push(&S,x) | 进栈,若栈S非空,将x加入使其称为新栈顶 |
Pop(&S,&x) | 出栈,若栈S非空,弹出栈顶元素,并用x返回 |
GetTop(S,&x) | 读栈顶元素,若栈S非空,用x返回栈顶元素 |
ClearStack(&S) | 销毁栈,并释放栈S占用的存储空间 |
- 这里的&S是指C++中引用的含义,在C语言中使用*可达到同样目的。一般传入参数,如果无需修改传入参数的值,则无需传址。
顺序存储结构
使用顺序存储结构实现的栈称为顺序栈,是指 利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶的位置。
#define MaxSize 50 //定义栈中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //存放栈中元素
int top; //栈顶指针
}SqStack;
共享栈
共享栈是利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数据空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。
链式存储结构
采用链式存储结构实现的栈称为链栈,优点在于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。
typedef struct LinkNode
{
ElemType data; //数据域
strcu LinkNode * next; //指针域
}*LinStack; //栈类型定义
- 一般使用单链表实现,并且规定所有操作都是在单链表的表头进行,这里规定链栈无头结点,Lhead指向栈顶元素。如下图所示:
应用
栈在括号匹配中的应用
算法思想:
(1)初始化设置一个空栈,顺序读入括号
(2)若是右括号,则或者使置于栈顶的最急迫期待得以消解,或者是不合法的情况(括号序列不匹配,则退出程序)
(3)若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有的在栈中的所有未消解的期待的急迫性降了一级。算法结束时,栈为空,否则括号系列不匹配栈在表达式求值中的应用
栈在递归中的应用