本文章会详细介绍栈的基本操作
目录
1.本文章中全部实现的功能
2.建栈
3.输入栈内元素(由于起初输入栈不牵扯到栈的扩容,所以对此部分注释)
4.进栈
5.弹栈,并且返回出弹栈元素
6.栈内元素的个数
7.按栈输入的顺序输出栈里面的值
8.按栈弹出的顺序输出栈
9.判断栈是否为空
10.获取栈顶元素
11.清空一个栈
12.摧毁一个栈
13.switch功能语句
14.全部代码
15.运行结果
1.本文章中全部实现的功能
栈的特点,先进后出。
- void program()
- {
- printf("\t请输入以下功能数字\n");
- printf("\t0.退出\n");
- printf("\t1.判断栈是否为空\n");
- printf("\t2.按栈弹出的顺序输出栈\n");
- printf("\t3.按栈输入的顺序输出栈里面的值\n");
- printf("\t4.获取栈顶元素\n");
- printf("\t5.摧毁一个栈\n");
- printf("\t6.清空一个栈\n");
- printf("\t7.求栈的长度\n");
- printf("\t8.弹栈,并且返回出弹栈元素\n");
- printf("\t9.输入栈内数据\n");
- printf("\t10.在清空的基础下重新建立栈\n");
- printf("\t11.请输入想要插入栈顶的元素\n");
-
- }
2.建栈
- Status InitStack(SqStack &S)
- {
- //建栈
- S.base=(int*)malloc(Stack_Init_Size*sizeof(int));
- if(!S.base) exit(OVERFLOW);
- S.top=S.base;
- S.stacksize=Stack_Init_Size;
- return OK;
- }
3.输入栈内元素(由于起初输入栈不牵扯到栈的扩容,所以对此部分注释)
- SqStack InputStack(SqStack &S)
- {
- int a;
- /*scanf("%d",&a);
- while(a!=-1)
- {
- if(S->top-S->base>S->stacksize)
- {
- S->base=(int *)realloc(S->base,(Stack_Init_Size+Stack_Increment)*sizeof(int));
- if(!S->base) printf("NoRealloc\n");
- S->top=S->base+S->stacksize;
- S->stacksize=S->stacksize+Stack_Increment;
- }
- *S->top++ = a;
- scanf("%d",&a);
- }*/
- InitStack(S);
- printf("\t");
- for(int i=0;;i++){
- scanf("%d",&a);
- if(a==-1)break;
- *S.top++ =a;
- }
- printf("\t写入完成\n");
- }
4.进栈
如果栈的内容小于输入内容不需要扩展直接*S.top++=e;但是当内容大于了栈的内容。就进入if语句。
- Status Push(SqStack &S,int e)
- {
- //进栈
- if(S.top-S.base>S.stacksize)
- {
- S.base=(int *)realloc(S.base,(Stack_Init_Size+Stack_Increment)*sizeof(int));
- if(!S.base) printf("NoRealloc\n");
- S.top=S.base+S.stacksize;
- S.stacksize=S.stacksize+Stack_Increment;
- }
- *S.top++=e;
- return OK;
- }
5.弹栈,并且返回出弹栈元素
- Status Pop(SqStack &S,int *e)
- {
- //弹栈,并且返回出弹栈元素
- *e=*--S.top;
- return OK;
- }
6.栈内元素的个数
- Status StackLength(SqStack S)
- {
- //栈长
- int Length=S.top-S.base;
- printf("\tlength = %d\n",Length);
- return Length;
- }
7.按栈输入的顺序输出栈里面的值
- void PrintStack_int(SqStack S)
- {
- //按栈输入的顺序输出栈里面的值
- int *p=S.base;
- while(p!=S.top)
- {
- printf("\t");
- printf(" %d ",*p);
- p++;
- }
- printf("\n");
- }
8.按栈弹出的顺序输出栈
- void PrintStack_Pop(SqStack S)
- {
- //按栈弹出的顺序输出栈
- int *p=S.top-1;
- while(p!=S.base-1)
- {
- printf("\t");
- printf(" %d ",*p);
- p--;
- }
- printf("\n");
- }
9.判断栈是否为空
- void IsNullStack(SqStack S)
- {
- //判断栈是否为空
- if(S.base==S.top||S.base==NULL)
- printf("\t栈为空栈\n");
- else
- printf("\t栈不为空\n");
- }
10.获取栈顶元素
- Status GetTop(SqStack S)
- {
- //获取栈顶元素
- int e;
- e=*(S.top-1);
- printf("\t栈顶元素为%d\n",e);
- }
11.清空一个栈
- void ClearStack(SqStack &S)
- {
- //清空一个栈
- S.top=S.base;
- }
12.摧毁一个栈
- void DestroyStack(SqStack &S)
- {
- //摧毁一个栈
- free(S.base);
- S.base=S.top;
- S.stacksize=0;
- S.top=NULL;
- S.base=NULL;
- }
13.switch功能语句
- void swi(SqStack S){
- int num;
- program();
- printf("\t输入的元素是:");
- scanf("%d",&num);
- printf("\n\n");
- while(num)
- {
- switch(num)
- {
- case 0:
- num=0;
- break;
- case 1:
- if(S.base==NULL){
- printf("\t在进行操作1之前需要操作功能9\n");
- }else{
- printf("\t判断栈是否为空\n");
- IsNullStack(S);
- }
- break;
- case 2:
- if(S.base==NULL){
- printf("\t在进行操作2之前需要操作功能9\n");
- }else{
- printf("\t2.按栈弹出的顺序输出栈\n");
- PrintStack_Pop(S);
- }
- break;
- case 3:
- if(S.base==NULL){
- printf("\t在进行操作3之前需要操作功能9\n");
- }else{
- printf("\t3.按栈输入的顺序输出栈里面的值\n");
- PrintStack_int(S);
- }
- break;
- case 4:
- if(S.base==NULL){
- printf("\t在进行操作4之前需要操作功能9\n");
- }else{
- printf("\t4.获取栈顶元素\n");
- GetTop(S);
- }
- break;
- case 5:
- if(S.base==NULL){
- printf("\t在进行操作5之前需要操作功能9\n");
- }else{
- printf("\t5.摧毁一个栈\n");
- DestroyStack(S);
- printf("\t栈已经被摧毁\n");
- }
- break;
- case 6:
- if(S.base==NULL){
- printf("\t在进行操作6之前需要操作功能9\n");
- }else{
- printf("\t6.清空一个栈\n");
- ClearStack(S);
- printf("\t栈已经清空");
- }
- break;
- case 7:
- if(S.base==NULL){
- printf("\t在进行操作7之前需要操作功能9\n");
- }else{
- printf("\t7.求栈的长度\n");
- StackLength(S);
- }
- break;
- case 8:
- if(S.base==NULL){
- printf("\t在进行操作8之前需要操作功能9\n");
- }else{
- printf("\t弹栈,并且返回出弹栈元素\n");
- int a;
- Pop(S,&a);
- printf("\t8.弹栈弹出的元素是%d\n",a);
- }
- break;
- case 9:
- printf("\t9.输入栈内数据\n");
- InputStack(S);
- break;
- case 10:
- if(S.base==NULL){
- printf("\t在进行操作10之前需要操作功能9\n");
- }else{
- printf("\t10.在清空的基础下重新建立栈\n");
- DestroyStack(S);
- printf("\t请重新输入栈内数据\n");
- InputStack(S);
- }
- break;
- case 11:
- if(S.base==NULL){
- printf("\t在进行操作11之前需要操作功能9\n");
- }else{
- printf("\t11.在栈顶插入元素\n");
- int x;
- printf("\t请输入想要插入栈顶的元素:\n");
- scanf("%d",&x);
- Push(S,x);
- printf("\t插入完成\n");
- }
- break;
- default:
- printf("输入有误,请重新输入\n");
- }
- printf("\n\n\n");
- program();
- printf("\t输入的元素是:");
- scanf("%d",&num);
- printf("\n\n");
- }
- }
14.全部代码
- //define区
- #define Stack_Init_Size 100
- #define Stack_Increment 10
- #define OK 1
- #define OVERFLOW -2
- #define ERROR 0
-
- //预处理指令区
- #include<stdio.h>
- #include<stdlib.h>
-
- //typedef
- typedef int Status;
- typedef struct {
- int *base;
- int *top;
- int stacksize;
- }SqStack;
-
- Status InitStack(SqStack &S); //建栈
- SqStack InputStack(SqStack &S); //输入栈内元素
- Status Push(SqStack &S,int e); //进栈
- Status Pop(SqStack &S,int *e); //弹栈,并且返回出弹栈元素
- Status StackLength(SqStack S); //栈内元素的个数
- void PrintStack_int(SqStack S); //按栈输入的顺序输出栈里面的值
- void PrintStack_Pop(SqStack S); //按弹栈顺序输出栈里面的值
- void IsNullStack(SqStack S); //判断是否为空栈
- Status GetTop(SqStack S); //获取栈顶元素
- void ClearStack(SqStack &S); //清空栈
- void DestroyStack(SqStack &S); //摧毁栈
- void program(); //功能函数
- void swi(SqStack S); //switch
-
- int main()
- {
- SqStack S;
- S.base=NULL;
- swi(S);
- printf("\t程序退出了,下次见\n");
- }
-
- Status InitStack(SqStack &S)
- {
- //建栈
- S.base=(int*)malloc(Stack_Init_Size*sizeof(int));
- if(!S.base) exit(OVERFLOW);
- S.top=S.base;
- S.stacksize=Stack_Init_Size;
- return OK;
- }
-
- SqStack InputStack(SqStack &S)
- {
- int a;
- /*scanf("%d",&a);
- while(a!=-1)
- {
- if(S->top-S->base>S->stacksize)
- {
- S->base=(int *)realloc(S->base,(Stack_Init_Size+Stack_Increment)*sizeof(int));
- if(!S->base) printf("NoRealloc\n");
- S->top=S->base+S->stacksize;
- S->stacksize=S->stacksize+Stack_Increment;
- }
- *S->top++ = a;
- scanf("%d",&a);
- }*/
- InitStack(S);
- printf("\t");
- for(int i=0;;i++){
- scanf("%d",&a);
- if(a==-1)break;
- *S.top++ =a;
- }
- printf("\t写入完成\n");
- }
-
- Status Push(SqStack &S,int e)
- {
- //进栈
- if(S.top-S.base>S.stacksize)
- {
- S.base=(int *)realloc(S.base,(Stack_Init_Size+Stack_Increment)*sizeof(int));
- if(!S.base) printf("NoRealloc\n");
- S.top=S.base+S.stacksize;
- S.stacksize=S.stacksize+Stack_Increment;
- }
- *S.top++=e;
- return OK;
- }
-
- Status Pop(SqStack &S,int *e)
- {
- //弹栈,并且返回出弹栈元素
- *e=*--S.top;
- return OK;
- }
-
- Status StackLength(SqStack S)
- {
- //栈长
- int Length=S.top-S.base;
- printf("\tlength = %d\n",Length);
- return Length;
- }
-
- void PrintStack_int(SqStack S)
- {
- //按栈输入的顺序输出栈里面的值
- int *p=S.base;
- while(p!=S.top)
- {
- printf("\t");
- printf(" %d ",*p);
- p++;
- }
- printf("\n");
- }
-
- void PrintStack_Pop(SqStack S)
- {
- //按栈弹出的顺序输出栈
- int *p=S.top-1;
- while(p!=S.base-1)
- {
- printf("\t");
- printf(" %d ",*p);
- p--;
- }
- printf("\n");
- }
-
- void IsNullStack(SqStack S)
- {
- //判断栈是否为空
- if(S.base==S.top||S.base==NULL)
- printf("\t栈为空栈\n");
- else
- printf("\t栈不为空\n");
- }
-
- Status GetTop(SqStack S)
- {
- //获取栈顶元素
- int e;
- e=*(S.top-1);
- printf("\t栈顶元素为%d\n",e);
- }
-
- void ClearStack(SqStack &S)
- {
- //清空一个栈
- S.top=S.base;
- }
-
- void DestroyStack(SqStack &S)
- {
- //摧毁一个栈
- free(S.base);
- S.base=S.top;
- S.stacksize=0;
- S.top=NULL;
- S.base=NULL;
- }
-
- void program()
- {
- printf("\t请输入以下功能数字\n");
- printf("\t0.退出\n");
- printf("\t1.判断栈是否为空\n");
- printf("\t2.按栈弹出的顺序输出栈\n");
- printf("\t3.按栈输入的顺序输出栈里面的值\n");
- printf("\t4.获取栈顶元素\n");
- printf("\t5.摧毁一个栈\n");
- printf("\t6.清空一个栈\n");
- printf("\t7.求栈的长度\n");
- printf("\t8.弹栈,并且返回出弹栈元素\n");
- printf("\t9.输入栈内数据\n");
- printf("\t10.在清空的基础下重新建立栈\n");
- printf("\t11.请输入想要插入栈顶的元素\n");
-
- }
-
- void swi(SqStack S){
- int num;
- program();
- printf("\t输入的元素是:");
- scanf("%d",&num);
- printf("\n\n");
- while(num)
- {
- switch(num)
- {
- case 0:
- num=0;
- break;
- case 1:
- if(S.base==NULL){
- printf("\t在进行操作1之前需要操作功能9\n");
- }else{
- printf("\t判断栈是否为空\n");
- IsNullStack(S);
- }
- break;
- case 2:
- if(S.base==NULL){
- printf("\t在进行操作2之前需要操作功能9\n");
- }else{
- printf("\t2.按栈弹出的顺序输出栈\n");
- PrintStack_Pop(S);
- }
- break;
- case 3:
- if(S.base==NULL){
- printf("\t在进行操作3之前需要操作功能9\n");
- }else{
- printf("\t3.按栈输入的顺序输出栈里面的值\n");
- PrintStack_int(S);
- }
- break;
- case 4:
- if(S.base==NULL){
- printf("\t在进行操作4之前需要操作功能9\n");
- }else{
- printf("\t4.获取栈顶元素\n");
- GetTop(S);
- }
- break;
- case 5:
- if(S.base==NULL){
- printf("\t在进行操作5之前需要操作功能9\n");
- }else{
- printf("\t5.摧毁一个栈\n");
- DestroyStack(S);
- printf("\t栈已经被摧毁\n");
- }
- break;
- case 6:
- if(S.base==NULL){
- printf("\t在进行操作6之前需要操作功能9\n");
- }else{
- printf("\t6.清空一个栈\n");
- ClearStack(S);
- printf("\t栈已经清空");
- }
- break;
- case 7:
- if(S.base==NULL){
- printf("\t在进行操作7之前需要操作功能9\n");
- }else{
- printf("\t7.求栈的长度\n");
- StackLength(S);
- }
- break;
- case 8:
- if(S.base==NULL){
- printf("\t在进行操作8之前需要操作功能9\n");
- }else{
- printf("\t弹栈,并且返回出弹栈元素\n");
- int a;
- Pop(S,&a);
- printf("\t8.弹栈弹出的元素是%d\n",a);
- }
- break;
- case 9:
- printf("\t9.输入栈内数据\n");
- InputStack(S);
- break;
- case 10:
- if(S.base==NULL){
- printf("\t在进行操作10之前需要操作功能9\n");
- }else{
- printf("\t10.在清空的基础下重新建立栈\n");
- DestroyStack(S);
- printf("\t请重新输入栈内数据\n");
- InputStack(S);
- }
- break;
- case 11:
- if(S.base==NULL){
- printf("\t在进行操作11之前需要操作功能9\n");
- }else{
- printf("\t11.在栈顶插入元素\n");
- int x;
- printf("\t请输入想要插入栈顶的元素:\n");
- scanf("%d",&x);
- Push(S,x);
- printf("\t插入完成\n");
- }
- break;
- default:
- printf("输入有误,请重新输入\n");
- }
- printf("\n\n\n");
- program();
- printf("\t输入的元素是:");
- scanf("%d",&num);
- printf("\n\n");
- }
- }
-
-
15.运行结果
在没有建立栈的条件下如果输入别的数据
1.建栈
2.按栈弹出的顺序输出栈
3.按栈输入的顺序输出栈里面的值
4.获取栈顶元素
7.求栈的长度
8.弹栈,并且返回出弹栈元素
验证:
11.请输入想要插入栈顶的元素
6.清空
验证:
10.在清空的状态下重新输入栈
验证:
5.摧毁栈
0.退出
文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览42750 人正在系统学习中