3.1.1 栈的定义
![](https://i-blog.csdnimg.cn/blog_migrate/313000a2a18c5dac5ea6a8421f4a9575.png)
3.1.2 栈的顺序存储
1)顺栈 定义
#define MaxSize 10 //定义 栈 元素最大数
typedef struct Stack
{
int data[MaxSize]; //静态数组 存放元素
int top; //栈顶下表(指针)
}SqStack;
2)栈的初始化
void InitStack(SqStack &S) //初始化栈
{
S.top = -1;
}
3)栈的判空
bool Empty(SqStack &S) //判空
{
return S.top == -1;
}
4)入栈
bool Push(SqStack &S, int e) //入栈
{
if (S.top == MaxSize - 1)return false; //栈满
S.data[++S.top] = e; //元素 e 入栈
return true;
}
5)出栈
bool Pop(SqStack &S, int &e)//出栈
{
if (S.top == -1)return false; //栈为空
e = S.data[S.top--]; //元素 e 出栈
return true;
}
6)读栈
bool GetTop(SqStack &S, int &e)//读栈
{
if (S.top == -1)return false;
e = S.data[S.top]; //e 读栈
return true;
}
7)共享栈
![](https://i-blog.csdnimg.cn/blog_migrate/f2b480b80de15fc81483f3dfcf2602c6.png)
3.1.3 栈的链式存储
![](https://i-blog.csdnimg.cn/blog_migrate/61fb75deac71de758a41e66536cec604.png)
1)链栈 定义
typedef struct LNode
{
int data; //数据域
struct LNode *next; //指针域
}*LiStack; // 栈类型 定义
//为什么链栈不需要头结点
//因为栈都是在头部进行操作
//加入头结点 使运算更复杂
2)栈的初始化
void InitStack(LiStack &S)//链栈 初始化
{
S = NULL;
}
3)栈的判空
bool Empty(LiStack &S)//栈的判空
{
return S == NULL;
}
4)入栈
bool Push(LiStack &S, int e)//入栈
{
LNode *p = (LNode*)malloc(sizeof(LNode));
if (p == NULL)return false;
p->data = e;
p->next = NULL;
if (S == NULL) //空栈
S = p;
else //非空栈
{
p->next = S;
S = p;
}
return true;
}
5)出栈
bool Pop(LiStack &S, int &e)//出栈
{
if (S == NULL)return false;
e = S->data;
LNode *p = S; //出栈
S = S->next;
free(p); //释放
return true;
}
6)读栈
bool GetTop(LiStack &S, int &e)//读栈
{
if (S == NULL)return false;
e = S->data;
return true;
}