#include<iostream>
#include<cstdlib>
using namespace std;
//定义初始化长度和每次增加的长度
const int STACK_INIT_SIZE=10;
const int STACK_INCREAMENT=2;
struct Stack{
int* base; //栈底
int* top; //栈顶
int stacksize; //已分配栈的大小
};
//函数声明
void show();//主界面
void InitStack(Stack &S);//初始化栈
void DestroyStack(Stack &S);//销毁栈
void ClearStack(Stack &S);//清空栈
int StackEmpty(Stack S);//判断栈是否为空
int StackLength(Stack S);//获取栈的长度
void GetTop(Stack S,int &e);//获取顶部元素
void Push(Stack &S,int e);//入栈
void Pop(Stack &S,int &e);//出栈
void StackVisit(Stack S);//从栈顶遍历栈
void Transfer(int n,int r,Stack &s);//数制转换
int main(){
show();
Stack s;
int e,action;
while(cin>>action){
switch(action){
case 1://初始化栈
system("cls");
InitStack(s);
break;
case 2://销毁栈
system("cls");
DestroyStack(s);
break;
case 3://清空栈
system("cls");
ClearStack(s);
cout<<"栈已经被清空"<<endl<<endl;
break;
case 4://判断栈是否为空
system("cls");
StackEmpty(s);
break;
case 5://获取栈的长度
system("cls");
StackLength(s);
break;
case 6://获取顶部元素
system("cls");
GetTop(s,e);
break;
case 7://入栈
system("cls");
cout<<"请输入将压入栈的元素个数:"<<endl;
int l;
cin>>l;
cout<<"请依次输入待压栈的元素:"<<endl;
for(int i=0;i<l;i++){
cin>>e;
Push(s,e);
}
break;
case 8://出栈
system("cls");
Pop(s,e);
break;
case 9://从栈顶遍历栈
system("cls");
StackVisit(s);
break;
case 10://数制转换
system("cls");
cout<<"请输入十进制数和需要转换为几进制数:"<<endl;
int n,r;
cin>>n>>r;
Transfer(n,r,s);
break;
default:
return 0;
}
system("pause");
system("cls");
show();
}
return 0;
}
//主界面
void show(){
cout<<"+----------------------------------------+"<<endl;
cout<<"| |"<<endl;
cout<<"| 1 ->初始化栈 |"<<endl;
cout<<"| 2 ->销毁栈 |"<<endl;
cout<<"| 3 ->清空栈 |"<<endl;
cout<<"| 4 ->判断栈是否为空 |"<<endl;
cout<<"| 5 ->获取栈长度 |"<<endl;
cout<<"| 6 ->获取栈顶元素 |"<<endl;
cout<<"| 7 ->压栈 |"<<endl;
cout<<"| 8 ->出栈 |"<<endl;
cout<<"| 9 ->遍历栈 |"<<endl;
cout<<"| 10->数制转换 |"<<endl;
cout<<"| 11->退出 |"<<endl;
cout<<"| |"<<endl;
cout<<"+----------------------------------------+"<<endl;
}
//初始化栈
void InitStack(Stack &S){
S.base=new int[STACK_INIT_SIZE];
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
cout<<"栈已经初始化!"<<endl<<endl;
}
//销毁栈
void DestroyStack(Stack &S){
delete S.base;
cout<<"栈已经被销毁"<<endl<<endl;
}
//清空栈
void ClearStack(Stack &S){
S.top=S.base;
}
//判断栈是否为空
int StackEmpty(Stack S){
if(S.base==S.top){
cout<<"栈为空"<<endl<<endl;
return 1;
} else {
cout<<"栈不为空!"<<endl<<endl;
return 0;
}
}
//获取栈的长度
int StackLength(Stack S){
cout<<"the length of the stack is "<<S.top-S.base<<endl<<endl;
return S.top-S.base;
}
//获取顶部元素
void GetTop(Stack S,int &e){
if(S.top==S.base){
cout<<"栈为空,长度为0"<<endl<<endl;
} else{
e=*(S.top-1);
cout<<"栈的长度为 "<<e<<endl<<endl;
}
}
//入栈
void Push(Stack &S,int e){
if(S.top-S.base>=S.stacksize){
//在原有的空间上增加一段空间,用realloc(),具体使用方法请自行百度
S.base=(int* )realloc(S.base,(S.stacksize+STACK_INCREAMENT)*sizeof(int));
if(!S.base){
cout<<"重新分配空间出错"<<endl<<endl;
} else {
S.top=S.base+S.stacksize;
S.stacksize+=STACK_INCREAMENT;
}
}
*(S.top++)=e;
cout<<e<<" 已经压入栈"<<endl;
}
//出栈
void Pop(Stack &S,int &e){
if(S.top==S.base){
cout<<"栈为空"<<endl<<endl;
} else {
e=*--S.top;
cout<<e<<" 已经出栈"<<endl;
}
}
//从栈顶遍历栈
void StackVisit(Stack S){
if(S.top==S.base){
cout<<"栈为空"<<endl<<endl;
}
int e;
while(S.top>S.base){
//方法一
cout<<*(--S.top)<<' ';
//方法二
//Pop(S,e);
}
cout<<endl;
}
//进制转换,将十进制的n转换为r进制的数
void Transfer(int n,int r,Stack &S){
ClearStack(S);
//n=(n/r)*r+n%r;
while(n){
Push(S,n%r);
n=n/r;
}
cout<<"转换成功!转换后的"<<r<<"进制数为:"<<endl;
while(S.top>S.base){
cout<<*(--S.top);
}
cout<<endl<<endl;
}