#include <iostream>
#include <cstring>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
using namespace std;
typedef int Status;
typedef char SElemType;
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S){
S.base=new SElemType[MAXSIZE];
if(!S.base)
exit(OVERFLOW);
S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
}
Status Push(SqStack &S,SElemType e){
if(S.top-S.base==MAXSIZE)
return ERROR;
*(S.top++)=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e){
if(S.top==S.base)
return ERROR;
e = *(--S.top);
return OK;
}
char GetTop(SqStack S){
if(S.top!=S.base)
return *(S.top-1);
}
int main(){
SqStack s;
int choose,flag=0;
string j;
SElemType e,t;
cout<<"1.初始化\n";
cout<<"2.入栈\n";
cout<<"3.取栈顶元素\n";
cout<<"4.出栈\n";
cout<<"5.退出\n";
choose =-1;
while(choose!=0){
cout<<"请选择:";
cin>>choose;
switch(choose){
case 1:
if(InitStack(s)){
flag=1;
cout<<"初始化成功!\n";
}
else
cout<<"初始化失败!\n";
break;
case 2:
cout<<"请输入要入栈的字符串:";
cin>>j;
if(flag){
flag=1;
cout<<"进栈的元素依次是:\n";
for(int i=0;i<j.length();i++){
Push(s,j[i]);
cout<<j[i]<<" ";
}
cout<<endl;
}
else
cout<<"栈未建立,请重新选择\n";
break;
case 3:
if(flag!=-1&&flag!=0){
cout<<"栈顶元素为:"<<GetTop(s)<<endl;
}
else
cout<<"栈中无元素,请重新选择\n";
break;
case 4:
cout<<"依次弹出的栈顶元素为:";
while(Pop(s,t)){
flag =-1;
cout<<t<<" ";
}
cout<<endl;
break;
case 5:
return 0;
}
}
return 0;
}
下面是带有注释解释版本,解释每行话的作用
#include <iostream>
#include <cstring> //包含字符串处理的头文件 ,用于使用字符相关的函数
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;
typedef char SElemType;//给char起了一个别名SElemType,用于表示栈中的元素类型
//栈的类型定义
typedef struct{
SElemType *base;//指向栈底的指针,是栈的起始地址
SElemType *top;//指向栈顶的指针
int stacksize;//记录栈得我当前容量,也就是栈能容纳的元素个数
}SqStack; //定义了结构体SqStack,表示顺序栈的结构
//初始化栈
Status InitStack(SqStack &S){
S.base=new SElemType[MAXSIZE];//用new动态分配内存空间,创建一个大小为MAXSIZE的数组,作为栈的存储空间,将其地址赋值给S.base
if(!S.base)
exit(OVERFLOW);//检查是否成功分配内存
S.top=S.base;//将栈顶指针指向栈底指针表示栈为空;
S.stacksize=MAXSIZE;//设置栈的容量为100,表示栈的最大存储空间
return OK;
}
//进栈函数
Status Push(SqStack &S,SElemType e){
if(S.top-S.base==S.stacksize)
return ERROR;//检查栈是否已满
*(S.top++)=e; //如果栈未满,将元素e赋值给栈顶指向的位置,然后将栈顶指针递增一位;
return OK;
}
//出栈函数
Status Pop(SqStack &S,SElemType &e){
if(S.top==S.base)
return ERROR;
e = *(--S.top);//如果栈不为空,将栈顶指针递减一位,然后将该位置的值赋值给e
return OK;
}
//取栈顶元素
char GetTop(SqStack S){
if(S.top!=S.base)
return *(S.top-1);
}
int main(){
SqStack s;//定义了一个顺序栈,用与存储字符元素
int choose,flag=0; //flag是标志变量,用于标记栈的状态
string j; //定义字符串j,用于存储用户输入的字符序列
SElemType e,t;//用于辅助栈的操作
cout<<"1.初始化\n";
cout<<"2.入栈\n";
cout<<"3.取栈顶元素\n";
cout<<"4.出栈\n";
cout<<"0.退出程序\n";
choose = -1;
while(choose!=0){
cout<<"请选择:";
cin>>choose;
switch (choose) {
case 1://初始化
if(InitStack(s) )
{
flag = 1;
cout<<"成功对栈进行初始化\n\n";
}
else
cout<<"初始化栈失败\n\n";
break;
case 2://入栈
cout<<"请输入要入栈的字符序列(例如ABCD):";
cin>>j;//用于接收用户输入的字符序列
if(flag){
flag = 1;
cout<<"进栈的元素依次为:\n";
for(int i=0;i<j.length();++i){
Push(s,j[i]);
cout<<j[i]<<" ";
}
cout<<endl<<endl;
}
else
cout<<"栈未建立,请重新选择\n";
break;
case 3:
if(flag!=-1&&flag!=0){
cout<<"栈顶元素为:"<<GetTop(s)<<endl<<endl;
}
else{
cout<<"栈中无元素,请重新选择\n";
}
break;
case 4:
cout<<"依次弹出的栈顶元素为:";
while(Pop(s,t)){
flag = -1;
cout<<t<<" ";
}
cout<<endl<<endl;
break;
default:
//TODO
break;
}
}
return 0;
}
发表回复