栈基本操作(顺序栈+数制转换)
#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; }
如需转载,请注明文章出处,谢谢!!!