###王道考研的学习领悟,个人喜好讲解清晰
定义:栈(stack)是只允许在一端进行插入或删除的线性表。
其重要术语:栈顶,栈底,空栈。

我们只需要把这个图看明白了,理解起来就很快。
在这次的栈实现中,我们会运用到类似顺序表的定义法,举个例子:
Elemtype *data; == Elemtype data[Maxsize];
在实际的代码操作中,指针与数组其实是等效的,指针指向一块申请的堆空间,而数组存在栈空间
所以,我们在对于顺序栈的声明时,可以看作是对顺序表的一次结构体声明。
对于每个数据结构,我们都要反问自己三要素
| 数据结构 | 顺序表 | 顺序栈 |
| 逻辑结构 | 结点相连,连续空间 | 结点相连,连续空间 |
| 物理结构 | 连续空间 | 连续空间 |
| 数据的运算/基本操作 | 可直接读取所有元素 | 只能快速读取栈顶元素 |
所以我们开始吧。
- #include
-
- #define MAXSIZE 10 //这里我就定义它有10个连续空间
- typedef int Elemtype;
-
- typedef struct{
- Elemtype data[MAXSIZE]; //静态数组存放栈的元素
- int top; //栈顶指针--->一直指向栈顶
-
- }SqStack;//声明一个栈
-
- //初始化栈
- bool InitStack(SqStack &s){
- s.top = -1; //将栈的指针设为空
- return true;
- }
补充一个小知识:如果我们使用---整型来定义数据结构的指针时,我们会使用 -1 来表示它此时指向为空,就相当于我们利用指针类型来定义的 中的NULL,空指针一样。
-2可以表示为该空间暂时空闲。 其实我们也可将 s.top = 0; 这是另一种设法,后面的操作又会需要改变一些细节。这里我们用常用的设法来进行栈的操作定义吧。
- //判断是否为空栈, 只要指针指向的为 -1 初始定义时,就可以认为是空栈
- bool IsEmpty{SqStack s)
- {
- if (s.top == -1)
- {
- return true; //此时栈顶指针指向空
- }
- else
- {
- return false;
- }
-
- }
- //栈的入栈,这里我会告诉你两种表示法,选择你喜欢的哪一个
-
- //@操作1
- bool Push1(SqStack &s,Elemtype e)
- {
- if (s.top == MAXSIZE-1)
- {
- return false; //判断是否满栈了
- }
- s.top = s.top + 1; //先把指针指向下一个栈顶
- s.data[top] = e; //再把目的数值赋给当前的栈顶
-
- return true;
-
- }
-
-
- //@操作二 ++a 的意思是,先进行a = a + 1的操作并把结果返回给操作中
-
- bool Push2(SqStack &s,Elemtype e)
- {
- if (s.top == MAXSIZE-1)
- {
- return false; //目的与操作一相同
- }
- s.data[++s.top] = e; //相当于把 操作1中的--- 1.指针加1 2.栈顶赋值 结合在一起写
- return true;
- }
入栈就是先把 栈顶指针加一位,指向没有值的栈顶,再通过数组的快速寻值【address】-
--> s.data[top] = e ,将 元素e赋给当前的栈,便完成了入栈操作。
- //栈的出栈
-
- //也有两个出栈写法
- bool Pop1(SqStack &s,Elemtype &e)
- {
- if (s.top == -1)
- {
- return false; //如果为空栈的话
- }
- //这时先把栈顶的值先拿出来
- e = s.data[s.top];
- s.top = s.top - 1;
- return true;
- }
-
- //出栈写法二 a-- 先完成该操作后 然后再进行 减1
- bool Pop1(SqStack &s,Elemtype &e)
- {
- if (s.top == -1)
- {
- return false; //如果为空的话
- }
- e = s.data[s.top--];
- return true;
- }
- //获取栈顶元素
- bool GetElem(SqStack s,Elemtype &e)
- {
- if (s.top == -1)
- {
- return false; //若为空,返回错
- }
- e = s.data[s.top];
- return true;
- }
- //改变栈顶的值
-
- bool ChangeNode(SqStack &s,Elemtype e)
- {
- if (s.top == -1)
- {
- return false;
- }
- s.data[s.top] = e;
- return true;
- }
- //无返回值
- void PrintAll(SqStack s)
- {
- while( s.top != -1)
- {
- printf("%d",s.data[s.top]);
- }
-
- }
以上就是基本的该栈的基本操作,感谢你的观看。