本文章会详细介绍栈的基本操作

目录

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.退出