一、定义:
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int top;
} SqStack;
1. 由于是顺序栈的实现,故定义一个连续存放的数组来存放元素;
2. 再定义一个int类型的变量存放栈顶元素的数组元素表示。(此小结初始化栈顶top=-1,即 top直接指代栈顶元素的下标)。
二、基本操作
void InitStack(SqStack& S);//1.初始化栈
bool StackEmpty(SqStack S);//2.判断栈是否为空
bool Push(SqStack& S, ElemType e);//3.进栈
bool Pop(SqStack& S, ElemType& e);//4.出栈
bool GetTop(SqStack& S, ElemType& e);/5./获取栈顶元素
void print(SqStack S);//6.打印输出栈
void DestroyStack(SqStack& S);//7.销毁栈
1. void InitStack(SqStack& S)
输入:将顺序栈输入,由于需要修改顺序栈,故加“&”
过程:top = -1 (注意此处的赋值不唯一)
返回值:无需返回任何值2. bool StackEmpty(SqStack S)
输入:输入顺序栈,由于无需修改,故无需加“&”
过程:判断top值
返回值:若空则返回“true”;若非空则返回“false”3. bool Push(SqStack& S, ElemType e)
输入:输入顺序栈和入栈元素值,由于需要修改顺序栈,故加引用“&”
过程:顺序栈需先判断栈是否满;再通过top值的变化,将需入栈元素入栈
返回值:若栈满则返回“false”,若栈未满则入栈后返回“true”4. bool Pop(SqStack& S, ElemType& e)
输入:输入顺序栈和出栈元素值,由于需要改变顺序栈以及返回出栈元素的值,故两形参前都应加引用“&”
过程:出栈需先判断栈中是否有元素;再通过top值的变化,将元素出栈
返回值:若栈空则返回“false”,若栈非空则出栈后返回“true”5. bool GetTop(SqStack S, ElemType& e)
输入:输入顺序栈和栈顶元素值,无需改变顺序栈但需返回栈顶元素值,故后一形参需加引用“&”
过程:先判断栈是否为空,若其为空则自然无栈顶元素;再返回栈顶元素值
返回值:若栈空则返回“false”,若栈非空则返回“true”6. void DestroyStack(SqStack& S)
输入:输入顺序栈,要改变,加“&”
过程:改变top值为-1,即可视为栈被清空
返回值:无需返回值0
三、代码
编译软件:VS2019
编译语言:C++
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int top;
} SqStack;
void InitStack(SqStack& S);//初始化栈
bool StackEmpty(SqStack S);//判断栈是否为空
bool Push(SqStack& S, ElemType e);//进栈
bool Pop(SqStack& S, ElemType& e);//出栈
bool GetTop(SqStack S, ElemType& e);//获取栈顶元素
void print(SqStack S);//打印输出栈
void DestroyStack(SqStack& S);//销毁栈
int main(void) {
SqStack S;
//1.初始化栈
InitStack(S);
//2.判断栈是否为空
if (StackEmpty(S)) {
printf("栈为空!\n");
}
else {
printf("栈的输出为:");
print(S);
printf("\n");
}
//3.进栈
Push(S, 1);
Push(S, 2);
Push(S, 3);
Push(S, 4);
Push(S, 5);
if (StackEmpty(S)) {
printf("栈为空!\n");
}
else {
printf("栈的输出为:");
print(S);
printf("\n");
}
//4.出栈
int e;
Pop(S, e);
printf("执行出栈操作,被删除元素为:%d.\n", e);
Pop(S, e);
printf("执行出栈操作,被删除元素为:%d.\n", e);
if (StackEmpty(S)) {
printf("栈为空!\n");
}
else {
printf("栈的输出为:");
print(S);
printf("\n");
}
//5.读取栈顶元素
GetTop(S, e);
printf("栈顶元素为:%d.\n", e);
//6.销毁栈
DestroyStack(S);
if (StackEmpty(S)) {
printf("栈为空!\n");
}
else {
printf("栈的输出为:");
print(S);
printf("\n");
}
return 0;
}
//1.初始化栈
void InitStack(SqStack& S) {
S.top = -1;
}
//2.判断栈是否为空
bool StackEmpty(SqStack S) {
if (-1 == S.top) {
return true;
}
else
return false;
}
//3.入栈操作
bool Push(SqStack& S, ElemType e) {
//判断栈是否满
if (S.top == MaxSize - 1) {
return false;
}
//执行插入操作
S.top = S.top + 1;
S.data[S.top] = e;
return true;
}
//4.出栈操作
bool Pop(SqStack& S, ElemType& e) {
//判断栈是否空
if (-1 == S.top) {
return false;
}
//执行删除操作
e = S.data[S.top];
S.top = S.top - 1;
return true;
}
//5.读取栈顶元素
bool GetTop(SqStack S, ElemType& e) {
if (-1 == S.top) {
return false;
}
e = S.data[S.top];
return true;
}
//6.销毁栈
void DestroyStack(SqStack& S) {
S.top = -1;
}
//7.打印输出
void print(SqStack S) {
int i = 0;
for (i = 0; i <= S.top; i++) {
printf("%d ", S.data[i]);
}
}
四、结果
五、分析