栈的特点
栈是一种 “ 后进先出 ” 的线性表
我们用stack表示 栈,则栈顶(top),栈底(bottom)
栈的举例
例如:洗盘子,我们需要清洗一摞盘子,总是先清洗上面的然后逐个 往下清洗(先进后出)
1、顺序栈的存储结构
#define MAXSIZE 100//上个专题讲过,顺序表需要提前申请空间
typedef struct{
selemType *base;//栈底指针
selemType *top; //栈顶指针
int size; //栈的最大容量
}sqStack;
2、初始化
1.为空栈动态分配最大容量为MAXSIZE的空间,使base指向基地址
2.栈顶指针初始化为base,表示栈S 为空
3.置栈s的最大空间为MAXSIZE
#define status int
status init_Stack(sqStack S){ //构造空栈,名称为S
S.base=new selemType[MAXSIZE];
if(!S.base)
return 0;
S.top=S.base; //初始化栈顶等于栈底
S.size=MAXSIZE; //MAXSIZE置为size的容量
return 1;
}
3、入栈
1.判断栈是否满了
2.将新的元素放在栈顶,栈顶指针top+1
status push(sqStack &S,selemStack e){
if(S.top-S.base==S.size)//栈满
return 0;
*S.top++=e;//元素送入栈顶,栈顶指针+1
return 1;
}
4、出栈
1.判断是否栈满
2.栈顶指针-1,移除栈顶元素
status pop(sqStack &S,selemType &e){
if(S.top-S.base==S.size)//栈满
return 0;
e=*(--S.top);//栈顶指针-1,栈顶赋值给e
return 1;
}
5、取栈顶
1.当栈非空时,返回当前栈顶元素的值,栈顶指针不变
bool get_Top(sqStack S,selemType &e){
if(S.top!=S.base)//表示栈非空
return flase;
else{
e=*(--S.top);
return ture;
}
}
顺序栈实现
1.头文件
#include<iostream>
#include<string>
#include<cstring>
#define status int
#define selemType int
#define MAXSIZE 100
using namespace std;
#include"head.h"
typedef struct{
selemType *base;//栈底指针
selemType *top;//栈顶指针
int size;//栈可用的最大容量
}sqStack;
status init_Stack(sqStack &S){
S.base=new selemType[MAXSIZE];//动态分配最大容量
if(!S.base){
cout<<"分配内存失败"<<endl;
return 0;
}
S.top=S.base;
S.size=MAXSIZE;
return 1;
};
status push(sqStack &S,selemType e){
if(S.top-S.base==S.size)
return 0;//栈满
*(S.top++)=e;
return 1;
}
status pop(sqStack &S,selemType &e){
if(S.top==S.base)
return 0;//栈空
e=*(--S.top);
return 1;
}
bool get_Top(sqStack S,selemType &e) {
if(S.top==S.base)
return false;//栈空
else e=*(--S.top);
return true;
}
void show_Menu(){
cout<<"1. 入栈 \t\t\t2.出栈"<<endl
<<"3.取栈顶\t\t\t4.退出"<<endl;
}
void stack_Push(sqStack &S,selemType e){
int n;
int elem;
cout<<"请输入入栈元素个数(>=1):"<<endl;
cin>>n;
for (int i=0;i<n;i++){
cout<<"请输入第 "<<i+1<<" 个元素的值:"<<endl;
cin>>e;
elem=push(S,e);
if(elem)
cout<<"元素 "<<e<<" 已入栈..."<<endl;
else {
cout<<"栈满..."<<endl;
break;
}
}
}
void stack_Pop(sqStack &S,selemType e){
int n;
int elem;
cout<<"请输入出栈元素个数(>=1):"<<endl;
cin>>n;
for (int i=0;i<n;i++){
elem=pop(S,e);
if(elem)
cout<<"元素 "<<e<<" 已出栈..."<<endl;
else {
cout<<"栈空..."<<endl;
break;
}
}
}
void get_Stack_Top(sqStack &S,selemType e){
bool elem;
elem=get_Pop(S,e);
if(elem)
cout<<"现在 "<<e<<" 为栈顶元素。"<<endl;
else
cout<<"栈空..."<<endl;
}
int main(){
sqStack S;
int choice;
init_Stack(S);
while(1){
show_Menu();
cout<<"请输入选项:"<<endl;
cin>>choice;
if(choice==4)
break;
switch(choice){
case 1:
stack_Push(S);
break;
case 2:
stack_Pop(S);
break;
case 3:
get_Stack_Top(S);
break;
default:
cout<<"非法输入!"<<endl;
}
}
cout<<"Done!"<<endl;
system("pause>nul");
return 0;
}