草庐IT

栈的基本操作(详细)

M DownTime 2023-04-28 原文

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

目录

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

 

 

 

 

 

 

 

 

有关栈的基本操作(详细)的更多相关文章

  1. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  2. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  3. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  4. ruby-on-rails - 使用 HTTParty 的非常基本的 Rails 4.1 API 调用 - 2

    Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"

  5. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  6. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  7. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  8. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

  9. ruby-on-rails - 如何让 Rails View 返回其关联的操作名称? - 2

    我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam

  10. ruby-on-rails - Rails 基本 Base64 身份验证 - 2

    我正在尝试复制此GETcurl请求:curl-D--XGET-H"Authorization:BasicdGVzdEB0YXByZXNlYXJjaC5jb206NGMzMTg2Mjg4YWUyM2ZkOTY2MWNiNWRmY2NlMTkzMGU="-H"Content-Type:application/json"http://staging.example.com/api/v1/campaigns在Ruby中,通过电子邮件+apikey生成身份验证:auth="Basic"+Base64::encode64("test@example.com:4c3186288ae23fd9661c

随机推荐