#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;
}