一,关于栈
我的理解就是一种具有特殊规定的数组结构的称呼(即先进后出,后进先出)
eg:类似于生活中往箱子里面放衣服,如果想从箱子里拿衣服,只能拿最上面的一层,即最后放进去的(后进先出)
二,栈的结构体表示
结构体定义
struct Node
{
int NodeNum[MaxSize]; //定义顺序栈大小
int top; //栈顶顺序表位置
int base; //栈底顺序表位置
int MaxNode; //栈的大小
};
图解:
如图的a b c d分别代表空栈,满栈,出栈,入栈情况。
首先可以看出跟数组的储存几乎类似。
然后根据图中可以得出:
- 判断空栈的方法即为:top是否等于base
- 判断栈满方法即为:top减去base是否与MaxNode相等
顺序栈的定义:
Node* Init() //定义
{
Node*S = new Node;
S->base = S->top = 0;
S->MaxNode = MaxSize;
return S;
}
先开辟新的空间,然后将top和base都赋值为0;
顺序栈入栈:
void Push(Node &S,int a) //入栈
{
if (S.top - S.base != S.MaxNode) //当栈顶减去栈底不等于栈大小,即栈未满栈
{
S.NodeNum[S.top] =a;
S.top++; //栈顶元素加一
}
}
先判断栈是否满了,若不满,将该数据存入到顺序栈中的top位,然后top++;
顺序栈出栈:
void Pop(Node &S) //出栈
{
int a;
if (S.top != S.base) //当栈顶不等于栈底,即栈不为空
{
S.top--; //栈顶元素减一
}
}
先判断栈是否为空,若不空,将top--(此处出栈也没返回元素,或显示,可自行添加)
查看栈顶元素:
void ShowTop(Node *P)
{
cout <<"栈顶元素为:"<< P->NodeNum[P->top - 1]<<endl;
}
因为top指向比栈顶元素多一位,所以栈顶元素位置即为top--
但是此处为什么要用top-1,因为top--的话栈顶位置也改变了,此处不需要改变栈顶位置,所以用top-1
(此处P->NodeNum[P->top - 1]和*(P->NodeNum+P->top - 1)的值是一样的,
可以自己理解一下这两句代码的含义)
关于栈的遍历:
void ShowAll(Node *P)
{
cout << "栈的遍历结果:";
Node *Q = Init(); //通过辅助栈进行遍历
while (P->top != P->base)
{
Push(*Q, P->NodeNum[--P->top]); //先将每一个数都存进辅助栈中
cout << P->NodeNum[P->top]<<" ";
}
while (Q->top != Q->base)
{
Push(*P, Q->NodeNum[--Q->top]); //再将辅助栈转入原栈中
}
}
因为栈只能从头开始出,所以需要定义一个新的辅助栈来进行遍历
或者直接定义一个新的int a等于top,然后进行遍历(突然感觉上面方法有点蠢)
全部代码
#include<iostream>
using namespace std;
#define MaxSize 20
//顺序栈
struct Node
{
int NodeNum[MaxSize]; //定义顺序栈大小
int top; //栈顶顺序表位置
int base; //栈底顺序表位置
int MaxNode; //栈的大小
};
Node* Init() //定义
{
Node*S = new Node;
S->base = S->top = 0;
S->MaxNode = MaxSize;
return S;
}
void Push(Node &S,int a) //入栈
{
if (S.top - S.base != S.MaxNode) //当栈顶减去栈底不等于栈大小,即栈未满栈
{
S.NodeNum[S.top] =a;
S.top++; //栈顶元素加一
}
}
void Pop(Node &S) //出栈
{
int a;
if (S.top != S.base) //当栈顶不等于栈底,即栈不为空
{
S.top--; //栈顶元素减一
}
}
void ShowAll(Node *P)
{
cout << "栈的遍历结果:";
Node *Q = Init(); //通过辅助栈进行遍历
while (P->top != P->base)
{
Push(*Q, P->NodeNum[--P->top]); //先将每一个数都存进辅助栈中
cout << P->NodeNum[P->top]<<" ";
}
while (Q->top != Q->base)
{
Push(*P, Q->NodeNum[--Q->top]); //再将辅助栈转入原栈中
}
}
void ShowTop(Node *P)
{
cout <<"栈顶元素为:"<< P->NodeNum[P->top - 1]<<endl;
}
int main()
{
Node *P = Init();
int a = 10;
Push(*P,a);
ShowTop(P);
Pop(*P);
ShowAll(P);
system("pause");
return 0;
}
学了几个新的编辑功能,不知道大家感觉怎么样。
有什么意见欢迎下面评论,感谢支持