/*
顺序栈的表示和实现
顺序栈:利用顺序存储结构,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素;
1.以top=0为栈空,即top=base为栈空;
2.以top=-1为栈空;
2019.04.15
*/
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef struct{
char *base; //栈底指针
char *top; //栈顶指针
int stacksize; //栈可用的最大容量
}SqStack;
//顺序栈的初始化
//算法步骤:
//1.为顺序站分配一个最大容量MAXSIZE的数组空间,使base指向这段空间的基地址,即栈底;
//2.栈顶指针top初始化为base,表示栈空;
//3.stacksize置为栈的最大容量MAXSIZE;
Status InitStack(SqStack &S){
//构造一个空栈S
S.base=new char[MAXSIZE]; //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if(!S.base)
exit(OVERFLOW); //存储空间分配失败则退出
S.top=S.base; //top初始化为base,栈空
S.stacksize=MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
return OK;
}
//顺序栈的销毁
Status DestroyStack(SqStack &S){
if(!S.base)
return ERROR;
delete S.base;
return OK;
}
//顺序栈清空
Status ClearStack(SqStack &S){
if(S.base==S.top||!S.base)
return ERROR;
S.top=S.base;
return OK;
}
//求栈的长度
int StackLength(SqStack S){
return S.top-S.base;
}
//顺序栈的入栈
//算法步骤:
//1.判断栈是否已满,若满则返回ERROR;
//2.将新元素压入栈顶,栈顶指针加1;
Status Push(SqStack &S,char e){
//插入元素e为新的栈顶元素
if(S.top-S.base==S.stacksize) //栈满
return ERROR;
*S.top++=e; //元素e压入栈顶,栈顶指针加1
return OK;
}
//顺序栈的出栈
//算法步骤:
//1.判断栈是否为空,若空则返回ERROR;
//2.栈顶指针减1,栈顶元素出栈;
Status Pop(SqStack &S,char &e){
//删除S的栈顶元素,用e返回其值
if(S.base==S.top)
return ERROR; //栈空
e=*--S.top; //栈顶指针减1,将栈顶元素赋值给e
return OK;
}
//取顺序栈的栈顶元素
//算法步骤:
//判断栈是否为空,若不为空则将栈顶元素赋值给e,栈顶指针不需要改变;
//区别:出栈:取出栈顶元素,栈顶指针减1;取栈:取出栈顶元素,栈顶指针不需要减1;
Status GetTop(SqStack S,char &e){
//返回S的栈顶元素,不修改栈顶元素
if(S.base!=S.top){
e=*(S.top-1);
return OK;
}
return ERROR;
}
int main(){
SqStack S;
while(1){
char tmp;
int option=0;
system("cls");
cout<<"顺序栈的实现"<<endl;
cout<<"1.顺序栈的初始化"<<endl;
cout<<"2.顺序栈的入栈"<<endl;
cout<<"3.顺序栈的出栈"<<endl;
cout<<"4.取栈顶元素"<<endl;
cout<<"0.退出"<<endl;
cout<<"Please input number:";
cin>>option;
switch(option){
case 1:
if(InitStack(S)==OK)
cout<<"1.Success!"<<endl;
else
cout<<"1.Error!"<<endl;
system("pause");
break;
case 2:
cout<<"Please input a elem:";
cin>>tmp;
if(Push(S,tmp)==OK)
cout<<"2.Success!"<<endl;
else
cout<<"2.Error!"<<endl;
system("pause");
break;
case 3:
if(Pop(S,tmp)==OK){
cout<<"3.Success!"<<endl;
cout<<"The elem is "<<tmp<<"!"<<endl;
}
else
cout<<"3.Error!"<<endl;
system("pause");
break;
case 4:
if(GetTop(S,tmp)==OK){
cout<<"4.Success!"<<endl;
cout<<"The elem is "<<tmp<<"!"<<endl;
}
else
cout<<"4.Error!"<<endl;
system("pause");
break;
case 0:
exit(0);
break;
default:
cout<<"Warming!Your input ERROR!"<<endl;
break;
}
}
return 0;
}
Data Structures - Representation and Implementation of Sequential Stacks
Guess you like
Origin http://43.154.161.224:23101/article/api/json?id=324774075&siteId=291194637
Recommended
Ranking