栈比前面的链表容易的多了去了
有限制,只要处理尾巴就可以了
不如链表增加插入删除花里胡哨头疼
优化来自@lady_killer9的代码
#include#include #include using namespace std; typedef struct Z{ int *base; //栈底·不变·指向首元素 int *top; //栈顶·初始也指向首元素 int max; //栈可用的最大容量100 }; //《功能组件·模块》 int init(Z &s,int t){ //《初始化》 int n=10; if(t==2){ printf("请规定栈的极限:"); scanf("%d",&n); } s.base=new int[n]; //动态分配最大容量(一片连续的内存) if(!s.base){ //没有捕获头指针 printf("分配失败n"); return 0; } s.top=s.base; //栈顶指针与栈底相同 s.max=n; return 1; } bool Push(Z &s,int e){ //《入栈》 if(s.top-s.base==s.max) return false;//栈满 *(s.top++)=e; return true;//头指针启动时指向空区,直接进来就可以 //直接给 头指针 指向的 那一片区域 赋值,实际上是存在base里,只是内存上连续 } bool Out(Z &s,int &e){ //《出栈》 if(s.top==s.base) return false;//栈空 e=*(--s.top); return true;//启动时,栈顶指针指向上方的空区待命,等待输入 //先往下一个才是指向 现存的栈顶 } bool Get(Z s,int &e){ //《栈顶元素》 if(s.top==s.base) return false;//栈空 else e=*(--s.top); return true; } int k(Z s){ //《判空/摧毁》 if (s.top==s.base&&s.top!=NULL&&s.base!=NULL) return 1; else if (s.top==NULL&&s.base==NULL) return 2; else return 0; } bool destory(Z &s){//《摧毁》 free(s.base); //底部指针是相当于数组,有空间要释放 s.base = NULL; s.top = NULL; //其他两个只是指针,置零即可 s.max=0; return true; } bool clear(Z &s){//《清空》 if(k(s)==2) return false; s.top = s.base; } int len(Z s){//《长度》 int *t=s.top-1,k=0; for(;t>=s.base;t--) k++; return k; } //《显示组件·模块》 void menu(int &t){ printf("********1.入栈 2.出栈*********n"); printf("********3.栈顶 4.新建栈*******n"); printf("********5.清空 6.摧毁*********n"); printf("请输入菜单序号:");scanf("%d",&t); } bool in(Z &s){ int n,e; bool flag; if(k(s)==2) return false; printf("请输入入栈元素个数(>=1):"); scanf("%d",&n); printf("依次输入入栈元素:"); for(int i=0;i len(s)||n<0) printf("输入不合法!n"); else{ for(int i=0;i s.base;t--) printf("%d ",*t); printf("%d》栈底n",*t); printf("总长度:%dnn",len(s)); return 0; } } int main(){ Z s;int t; init(s,1); while(1){ system("cls");print(s); if (k(s)==1) printf("这是个空栈~nnn"); if (k(s)==2) printf("栈已被摧毁!nnn"); menu(t); switch(t){ case 1:in(s); break; case 2:out(s); break; case 3:get(s); break; case 4:init(s,2); break; case 5:clear(s); break; case 6:destory(s); break; default:printf("输入错误!!n"); } printf("n"); system("pause"); } return 0; }



