/*
*@author zhazhazhi
*qq:2055418639
*github:zhazhazhi7
*/
顺序栈
什么是顺序栈
顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
顺序栈的定义
栈需要一个bottom指针做栈底,需要一个top指针做栈顶,需要一个size来做栈的长。
typedef struct LStack{
int size;
int *top;
int *bottom;
}LStack;//定义栈
顺序栈的初始化
*注:本博客的top总是指向下一个空栈,所有的访问栈顶都需要指针下移一位
栈的初始化需要将栈顶与栈底指针放在一起,当压栈的时候指针再向下走一位,size为栈的长度,不是栈底到栈顶的长度
int initStack(LStack &s){
s.bottom = (int *)malloc(MAXIN*sizeof(int));
if(!s.bottom){
cout<<"地址分配失败"<<endl;
return 0;
}
s.top = s.bottom;
s.size = MAXIN;
cout<<"初始化成功"<<endl;
return 0;
}//初始化栈
栈的地址依然用动态地址分配
顺序栈的压入
顺序栈的压入需要将栈顶指针向上移动,这个时候需要先判断栈顶指针是否到达最远,及top指针是否为空(前面定义栈时已经给了栈的大小size。栈顶指针在赋值后要继续指向下一位。
int Push(LStack &s,ElemType e){
if(!s.top){
cout<<"栈满"<<endl;
return 0;
}
*(s.top)=e;
s.top++;
// cout<<"压栈成功"<<endl;
return 0;
}//压栈
顺序栈的弹出
弹出时依然需要做判空处理,即判断是否top==bottom——栈空,同时也用来判断栈顶指针是否需要继续下移一位。
int Pop(LStack &s){
if(s.top==s.bottom){
cout<<"栈空"<<endl;
return 0;
}
s.top--;
cout<<"弹出成功"<<endl;
return 0;
}//弹栈
顺序栈取顶
取栈顶元素是比较重要的操作,可以方便我们判断操作是否正确执行,或者程序是否按我们的想法在运行。
ElemType GetTop(LStack s){
ElemType e;
if(s.top==s.bottom){
cout<<"栈已空"<<endl;
return 0;
}
e = *(s.top-1);
cout<<"现在的栈顶元素为:"<<e<<endl;
return e;
}//获得栈顶元素
完整代码演示
#include<bits/stdc++.h>
using namespace std;
#define MAXIN 20
typedef int ElemType;
typedef struct LinkStack{
int *top;
int *bottom;
int size;
}LinkStack;//定义链式栈
int InitStack(LinkStack &s){
s.bottom = (int *)malloc(MAXIN*sizeof(int));
if(!s.bottom){
cout<<"地址分配失败"<<endl;
return 0;
}
s.top = s.bottom;
s.size = MAXIN;
cout<<"初始化成功"<<endl;
return 0;
}//初始化链式栈
int Push(LinkStack &s,ElemType e){
if(!s.top){
cout<<"栈满"<<endl;
return 0;
}
*s.top = e;
s.top++;
cout<<"压入成功"<<endl;
return 0;
}//压入
int Pop(LinkStack &s){
if(s.top == s.bottom){
cout<<"栈空"<<endl;
return 0;
}
s.top--;
cout<<"弹出成功"<<endl;
return 0;
}//弹出
ElemType GetStack(LinkStack s){
if(s.top==s.bottom){
cout<<"栈空"<<endl;
return 0;
}
cout<<"栈顶元素为:"<<*(s.top-1)<<endl;
return *(s.top-1);
}//取栈顶元素
int main(){
LinkStack s;
InitStack(s);
ElemType e;
cout<<"请输入要压入的栈元素"<<endl;
for(int i=0;i<5;i++){
cin>>e;
Push(s,e);
}
cout<<"现在的栈顶元素为:"<<endl;
GetStack(s);
cout<<"弹出一个栈顶元素"<<endl;
Pop(s);
cout<<"现在的栈顶元素为:"<<endl;
GetStack(s);
}
谢谢阅读!
接下来可能会写一些用栈解决的算法问题,感兴趣的小伙伴可以继续关注!!!