###王道考研的学习领悟,个人喜好讲解清晰
何为栈?
定义:栈(stack)是只允许在一端进行插入或删除的线性表。
其重要术语:栈顶,栈底,空栈。
我们只需要把这个图看明白了,理解起来就很快。
在这次的栈实现中,我们会运用到类似顺序表的定义法,举个例子:
Elemtype *data; == Elemtype data[Maxsize];
在实际的代码操作中,指针与数组其实是等效的,指针指向一块申请的堆空间,而数组存在栈空间
所以,我们在对于顺序栈的声明时,可以看作是对顺序表的一次结构体声明。
对于每个数据结构,我们都要反问自己三要素
|------------|-----------|------------|
| 数据结构 | 顺序表 | 顺序栈 |
| 逻辑结构 | 结点相连,连续空间 | 结点相连,连续空间 |
| 物理结构 | 连续空间 | 连续空间 |
| 数据的运算/基本操作 | 可直接读取所有元素 | 只能快速读取栈顶元素 |
所以我们开始吧。
栈的定义(Stack):
一.栈的定义&初始化
cpp
#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; 这是另一种设法,后面的操作又会需要改变一些细节。这里我们用常用的设法来进行栈的操作定义吧。
二.判断栈是否为空栈
cpp
//判断是否为空栈, 只要指针指向的为 -1 初始定义时,就可以认为是空栈
bool IsEmpty{SqStack s)
{
if (s.top == -1)
{
return true; //此时栈顶指针指向空
}
else
{
return false;
}
}
三.栈的入栈(push)
cpp
//栈的入栈,这里我会告诉你两种表示法,选择你喜欢的哪一个
//@操作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赋给当前的栈,便完成了入栈操作。
四.栈的出栈
cpp
//栈的出栈
//也有两个出栈写法
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;
}
五.读取栈顶元素
cpp
//获取栈顶元素
bool GetElem(SqStack s,Elemtype &e)
{
if (s.top == -1)
{
return false; //若为空,返回错
}
e = s.data[s.top];
return true;
}
六.改变栈顶的值
cpp
//改变栈顶的值
bool ChangeNode(SqStack &s,Elemtype e)
{
if (s.top == -1)
{
return false;
}
s.data[s.top] = e;
return true;
}
七.读取栈里的所有值
cpp
//无返回值
void PrintAll(SqStack s)
{
while( s.top != -1)
{
printf("%d",s.data[s.top]);
}
}
以上就是基本的该栈的基本操作,感谢你的观看。