zoukankan      html  css  js  c++  java
  • 链式栈-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;
            }
        }
    }
  • 相关阅读:
    go语言从零学起(三) -- chat实现的思考
    go语言从零学起(二)--list循环删除元素(转载)
    go语言从零学起(一) -- 文档教程篇
    Spring框架事务支持模型的优势
    Thymeleaf
    社保到底是多交好,还是少交好?
    使用静态工厂方法而不是构造器
    EJB、RMI、XMLRPC、Hessian、Thrift 、Protobuf
    MySQL存储过程
    MySQL常用功能语句分类总结
  • 原文地址:https://www.cnblogs.com/yurui/p/9527048.html
Copyright © 2011-2022 走看看