本文章会详细介绍栈的基本操作
目录
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#include//typedeftypedef 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); //switchint 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.退出