数据结构考研复习(顺序栈)
顺序栈的创建与顺序表类似,同样需要地址连续的存储单元,因此可以参考之前的内容进行处理:
https://www.cnblogs.com/hortz/p/15080282.html
与此同时,也可以发现之前的代码依然存在不少问题,比如无效变量以及代码繁琐,重复率高等,总之还是很有收获。
#include<stdio.h> #define MaxSize 50 typedef struct { int data[MaxSize]; int top; }SqStack; /* -1- 初始化顺序栈*/ bool InitStack(SqStack &S){ S.top = -1;//初始化栈顶指针 return true; } /*-2- 判断是否栈空*/ bool StackEmpty(SqStack S){ if(S.top == -1){ return true; } else { return false; } } /* -3- 进栈(插入元素)*/ bool Push(SqStack &S,int e){ if(S.top == MaxSize-1) { printf("栈满!\n"); return false; } S.data[++S.top] = e;//指针先加一,再入栈 return true; } /* -4- 读取栈顶元素*/ bool GetTop(SqStack S,int &e){ if(StackEmpty(S))//S.top == -1 { printf("栈空!\n"); return false; } e = S.data[S.top]; return true; } /* -5- 出栈*/ bool Pop(SqStack &S,int &e){ if(StackEmpty(S))//S.top == -1 { printf("栈空!\n"); return false; } e = S.data[S.top--];//先出栈指针再减一 return true; } int main(){ SqStack S; if(InitStack(S)) { printf("创建成功!\n"); printf("===========\n"); } else { printf("创建失败!\n"); } int e_1,l; printf("请输入顺序栈的长度\n"); scanf("%d",&l); printf("请依次输入%d个值:\n",l); for(int i = 1;i <= l;i++) { scanf("%d",&e_1); Push(S,e_1); } int flag; printf("请进行选择:\n"); printf("==1.输出栈顶元素\n"); printf("==2.依次出栈(输出)\n"); printf("==3.输出栈底元素\n"); scanf("%d",&flag); switch(flag){ case(1): { int e_2; GetTop(S,e_2); printf("栈顶元素为:%d ",e_2); printf("\n"); break; } case(2): { int e_2,i=0; while(l > 0){ GetTop(S,e_2); printf("此时栈顶元素是 【%d】 当前已执行%d次出栈操作\n",e_2,i); Pop(S,e_2); l--; i++; } printf("结束!\n"); break; } case(3): { SqStack T; if(!InitStack(T)) { printf("发生错误!"); return false; } int e_4; Push(T,GetTop(S,e_4)); Pop(S,e_4); GetTop(T,e_4);//这部分或许可以用来作逆置栈的操作。 printf("栈底元素为:%d\n",e_4); break; } } return 0; }
最终结果: