• 链式栈-C语言实现


    相对于顺序栈的空间有限,链式栈的操作则更加灵活

    #include<stdio.h>
    #include<malloc.h>
    typedef int SElemType;                    //元素类型
    typedef int Status;                        //返回值类型
    #define OK 1                            //操作成功
    #define ERROR 0                            //操作失败
    
    typedef struct StackNode                //链栈结点结构体
    {
        SElemType date;                        //节点数据
        struct StackNode *next;                //节点指针
    }*LinkStackPtr;                            //结点名
    
    typedef struct LinkStack                //链栈结构体
    {
        LinkStackPtr top;                    //栈顶指针
        int count;                            //栈结点数量
    }LinkStack;                                //栈名
    
    /*链栈的入栈操作*/
    Status Push(LinkStack *S, SElemType e)
    {
        LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));        //申请新结点
        s->date = e;                            //新结点的数据等于e
        s->next = S->top;                        //新结点的下一结点等于现在的栈顶结点
        S->top = s;                                //栈顶结点等于新结点
        S->count++;                                //栈中数据加1
        return OK;
    }
    
    /*链栈的出栈操作*/
    Status Pop(LinkStack *S, SElemType *e)
    {
        if(S->count == 0)                //判断栈是否为空
            return ERROR;
        LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));        //申请新结点
        s = S->top;                        //新结点等于当前栈顶结点
        *e = s->date;                    //e等于栈顶结点的数据
        S->top = s->next;                //栈顶等于新结点的下一结点
        free(s);                        //释放新结点
        S->count--;                        //栈中数据减1
        return OK;
    }
    
    void main()
    {
        LinkStack S;            //创建栈L
        S.count = 0;            //栈顶指针为-1,栈为空
        int e;                //入栈与出栈的元素
    
        while(true)
        {
            printf("请选择对链栈的操作:
    ");
            printf("1.入栈
    ");
            printf("2.出栈
    ");
            printf("3.退出
    ");
            int a;
            scanf("%d", &a);
            switch(a)
            {
                case 1:
                    printf("请输入入栈的元素:");
                    scanf("%d", &e);
                    if(Push(&S, e))
                        printf("入栈成功
    ");
                    else
                        printf("入栈失败
    ");
                    break;
                case 2:
                    if(Pop(&S, &e))
                        printf("出栈的元素为:%d
    ",e);
                    else
                        printf("栈空
    ");
                    break;
                case 3:
                    return;
                default:
                    printf("选择错误
    ");
                    break;
            }
        }
    }
  • 相关阅读:
    js根据年月获取当月最后一天
    skywalking 执行流程 日志放在哪里 MySQL或者ES
    SpringCloud微服务间安全调用实现(SpringSecurity+Oauth2+Jwt)
    内存泄露和内存溢出的区别
    Mybatis的执行流程
    Spring如何解决循环依赖
    Spring事务在哪几种情况下会失效?
    Spring Boot 中application.yml与bootstrap.yml的区别
    Nacos执行流程
    Gateway 如何解决跨域问题
  • 原文地址:https://www.cnblogs.com/yurui/p/9527048.html
Copyright © 2020-2023  润新知