###王道考研的学习领悟,个人喜好讲解清晰
何为栈?
定义:栈(stack)是只允许在一端进行插入或删除的线性表。
其重要术语:栈顶,栈底,空栈。
我们只需要把这个图看明白了,理解起来就很快。
在这次的栈实现中,我们会运用到类似顺序表的定义法,举个例子:
Elemtype *data; == Elemtype data[Maxsize];
在实际的代码操作中,指针与数组其实是等效的,指针指向一块申请的堆空间,而数组存在栈空间
所以,我们在对于顺序栈的声明时,可以看作是对顺序表的一次结构体声明。
对于每个数据结构,我们都要反问自己三要素
数据结构 | 顺序表 | 顺序栈 |
逻辑结构 | 结点相连,连续空间 | 结点相连,连续空间 |
物理结构 | 连续空间 | 连续空间 |
数据的运算/基本操作 | 可直接读取所有元素 | 只能快速读取栈顶元素 |
所以我们开始吧。
栈的定义(Stack):
一.栈的定义&初始化
#include <stdio.h>#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;}}
三.栈的入栈(push)
//栈的入栈,这里我会告诉你两种表示法,选择你喜欢的哪一个//@操作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]);}}
以上就是基本的该栈的基本操作,感谢你的观看。