【顺序栈的初始化、判空、取栈顶元素、入栈、出栈】
栈和队列是操作受限的线性表
顺序栈
S.base
:栈底指针,始终指向栈底
S.top
:栈顶指针, 栈空时指向栈底,栈非空时指向栈顶元素的上一个位置
栈满:S.top - S.base == S.stacksize
栈空:S.top == S.base
都指向栈底
入栈:*S.top++ = e
先入栈,再栈顶指针++
出栈:e = *--S.top
先栈顶指针- -,再出栈
#include<bits/stdc++.h>
using namespace std;
typedef int Status;
typedef int SElemType;
#define OVERFLOW -1
#define ERROR 0
#define OK 1
//------顺序栈的存储结构-----
#define MAXSIZE 100
typedef struct
{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用的最大容量
}SqStack;
SqStack S;
//1、顺序栈初始化
Status InitStack(SqStack &S)
{//构造一个空栈S
S.base = new SElemType[MAXSIZE]; //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if(!S.base)
exit(OVERFLOW); //储存分配失败
S.top = S.base; //top初始为base,空栈
S.stacksize = MAXSIZE;
return OK;
}
//2、顺序栈销毁
//3、顺序栈清空
//4、顺序栈判空
int StackEmpty(SqStack S)
{
if(S.top == S.base)
return OK;
else
return ERROR;
}
//6、顺序栈取栈顶元素
SElemType GetTop(SqStack S)
{//返回S的栈顶元素, 不修改栈顶指针
if(S.top != S.base) //栈非空
return *(S.top - 1); //返回栈顶元素的值,栈顶指针不变
}
//7、顺序栈入栈
Status Push(SqStack &S, SElemType e)
{//插入元素e为新的栈顶元素
if(S.top - S.base == S.stacksize)
return ERROR; //栈满
*S.top++ = e; //先将元素e压入栈顶,再栈顶指针+1
return OK;
}
//8、顺序栈出栈
Status Pop(SqStack &S, SElemType &e)
{//删除S的栈顶元素,用e返回其值
if(S.top == S.base)
return ERROR; //栈空
e = *--S.top; //先栈顶指针-1,再将栈顶元素赋给e
return OK;
}
//测试
int main(){
cout<<"-------------------顺序栈菜单---------------"<<endl;
cout<<"0、退出程序"<<endl;
cout<<"1、初始化"<<endl;
cout<<"2、判空"<<endl;
cout<<"3、获取顶端元素"<<endl;
cout<<"4、入栈"<<endl;
cout<<"5、出栈"<<endl;
cout<<"-------------------------------------------"<<endl;
int a, flag = 1;
while(flag){
cout<<'\n'<<"请选择要执行的操作:";
cin>>a;
switch(a){
case 0: {
cout<<"感谢使用本程序,祝您生活愉快!"<<'\n';
flag = 0;
break;
}
case 1: {
if(InitStack(S))
cout<<"初始化完毕!"<<endl;
else
cout<<"初始化失败"<<endl;
break;
}
case 2: {
if(StackEmpty(S))
cout<<"栈空"<<endl;
else
cout<<"栈非空"<<endl;
break;
}
case 3: {
if(!StackEmpty(S))
cout<<"栈顶元素为:"<<GetTop(S)<<endl;
else
cout<<"栈空,无法获取栈顶元素"<<endl;
break;
}
case 4: {
cout<<"请输入入栈元素:";
SElemType e;
cin>>e;
if(Push(S, e))
cout<<e<<"元素已入栈!"<<endl;
else
cout<<"栈满,无法入栈"<<endl;
break;
}
case 5: {
SElemType e;
if(Pop(S, e))
cout<<e<<"元素已出栈!"<<endl;
else
cout<<"栈空,无法出栈"<<endl;
break;
}
}
}
return 0;
}