数据结构:顺序栈
2022年4月7日
数据结构:顺序栈
实验目标:
提示
(1)初始化栈
(2)将元素e入栈
(3)出栈,用e返回出栈元素
(4)返回栈顶元素
(5)清空栈
(6)遍历栈元素(从栈底到栈顶)
(7)进制转换函数,将十进制dec数转化为n进制数,并输出转换后结果
实验代码
#include <iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef int SElemType;
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S)//初始化栈,构造一个空栈
{
S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S.base) exit(OVERFLOW);//分配存储空间失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack &S,SElemType e)//将元素e入栈
{
if(S.top-S.base >= S.stacksize){//若已经满栈,就追加存储空间
S.base = (SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);//分配存储空间失败
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ =e;
return OK;
}
Status Pop(SqStack &S,int &e)//出栈,用e返回出栈元素
{
if(S.top == S.base) return ERROR;//若栈为空,则返回ERROR
e=*--S.top;
return OK;
}
Status GetTop(SqStack &S)//返回栈顶元素
{
if(S.top == S.base) return ERROR;//判断栈是否存在
int e = *(S.top-1);
cout<<"栈顶元素为:"<<e;
cout<<endl;
return OK;
}
void ClearStack(SqStack &S)//清空栈
{
if(S.top == S.base) cout<<"清空失败,栈不存在!"<<endl;//判断栈是否存在
else{
delete S.base;
S.stacksize=0;
S.base=S.top=NULL;
cout<<"清空成功!"<<endl;
}
}
void Traverse(SqStack &S)//遍历栈元素(从栈底到栈顶)
{
if(S.top == S.base) cout<<"遍历失败,栈不存在!"<<endl;//判断栈是否存在
for(int *p=S.base;p<S.top;*p++){
int e=*p;
cout<<e<<" ";
}
cout<<endl;
}
void Convert(int dec ,int n)//进制转换函数,将十进制dec数转化为n进制数,并输出转换后结果
{
SqStack S;
InitStack(S);
int e;
while(dec){
e=dec%n;
dec/=n;
Push(S,e);
}
cout<<"转换后为:";
while(S.top!=S.base){
Pop(S,e);
if(e>=10) cout<<(char)('A'+e-10);
else cout<<e;
}
cout<<endl;
}
int main()
{
SqStack S;
int e;
while(1){
cout<<endl;
cout<<"**1,初始化栈"<<endl;
cout<<"**2,将元素e入栈"<<endl;
cout<<"**3,出栈,用e返回出栈元素"<<endl;
cout<<"**4,返回栈顶元素"<<endl;
cout<<"**5,清空栈"<<endl;
cout<<"**6,遍历栈元素(从栈底到栈顶)"<<endl;
cout<<"**7,进制转换函数,将十进制dec数转化为n进制数,并输出转换后结果"<<endl;
cout<<"**0,退出系统"<<endl;
int choice;
cout<<"请输入要进行的操作:";
cin>>choice;
cout<<endl;
switch(choice){
case 1:InitStack(S);break;
case 2:{
int n;
cout<<"请输入本次入栈的元素个数:";
cin>>n;
cout<<endl<<"请输入要插入的元素:";
for(int i=1;i<=n;i++){
cin>>e;
Push(S,e);
}
cout<<"入栈成功!";
cout<<endl<<"本次插入的元素如下:";
Traverse(S);
break;
}
case 3:{
int n;
cout<<"请输入本次出栈的元素个数:";
cin>>n;
cout<<endl;
for(int i=n;i>0;i--) Pop(S,e);
cout<<"出栈成功!"<<endl;
cout<<"剩下的元素为:";
Traverse(S);
break;
}
case 4:GetTop(S);break;
case 5:ClearStack(S);break;
case 6:Traverse(S);break;
case 7:{
int dec,n;
cout<<"请输入要转换的十进制数:";
cin>>dec;
cout<<endl<<"请输入要转换到几进制数:";
cin>>n;
cout<<endl;
if(n!=2 && n!=8 && n!=16) cout<<"输入错误!"<<endl;
else Convert(dec,n);
break;
}
case 0:exit(0);
}
}
system("pause");
return 0;
}