目录
一、栈:计算机世界的 “后入先出” 神器
在数据结构的奇妙世界里,栈(Stack)就像一个特殊的容器,有着独特的运行规则。它是一种线性表,却限定了插入和删除操作只能在一端进行,这一端被称为栈顶(Top),而另一端则是栈底(Bottom)。打个比方,它就像一个只有一端开口的杯子,你只能从杯口放入或取出物品 。
栈最大的特点,就是遵循 “后进先出”(Last In First Out,LIFO)的原则。什么意思呢?想象一下你往书架上放书,最后放上去的那本书,肯定是在最上面,下次你要取书的时候,也会最先拿到它。在栈里,最后进入的数据元素,会被最先取出来,而最先进入的数据元素,则会被压在栈底,最后才被取出。就像一个叠罗汉的游戏,最上面的人总是先下来,最下面的人最后才下来。
栈的操作主要有以下几种:
-
初始化:创建一个空栈,就像准备一个空杯子,等待装东西。
-
入栈(Push):把元素添加到栈顶,相当于往杯子里放东西。
-
出栈(Pop):从栈顶移除元素,就像从杯子里拿出东西。
-
获取栈顶元素(Top):查看栈顶的元素,但不把它移除,类似看一眼杯子最上面放的是什么,但不拿走。
-
判断栈是否为空(IsEmpty):检查栈里有没有元素,如同看看杯子是不是空的。
这些操作虽然简单,但却有着广泛的应用,比如在函数调用、表达式求值、括号匹配等场景中,栈都发挥着重要的作用,是数据结构中不可或缺的一部分 。
二、顺序栈:数组撑起的 “栈天地”
(一)顺序栈的结构剖析
顺序栈是栈的一种常见实现方式,它基于数组来存储数据元素 。想象一下,你有一个固定大小的书架,这个书架就是数组,而每一层书架都可以放一本书(数据元素)。在顺序栈中,我们需要预先确定栈的大小,也就是书架的层数。
为了管理这个栈,我们引入了一个重要的概念 —— 栈顶指针(top)。栈顶指针就像一个标记,它指向栈顶元素在数组中的位置。当栈为空时,top 通常被初始化为 -1,表示书架上没有书。每进行一次入栈操作,也就是往书架上放一本书,top 就会增加 1,指向新的栈顶元素;而出栈操作,即从书架上拿走一本书,top 则会减 1 。比如,一开始栈为空,top = -1,当第一个元素入栈后,top 变为 0,指向这个新入栈的元素;如果再入栈一个元素,top 就变成 1,以此类推 。
(二)顺序栈操作大揭秘
初始化:这是创建顺序栈的第一步,就像准备一个空书架。我们需要为数组分配内存空间,并将栈顶指针 top 初始化为 -1 。例如,在 C 语言中,可以这样实现:
#define MAXSIZE 100 // 定义栈的最大容量
typedef struct {
int data[MAXSIZE]; // 用数组存储数据
int top; // 栈顶指针
} SeqStack;
// 初始化顺序栈
void InitStack(SeqStack *S) {
S->top = -1;
}
入栈(Push):把元素添加到栈顶的操作。首先要检查栈是否已满,如果未满,就将元素放入 top + 1 的位置,然后 top 加 1 。例如:
// 入栈操作
int Push(SeqStack *S, int x) {
if (S->top == MAXSIZE - 1)