• 13 一个完整的链栈代码


    项目结构:

    main.cpp:

    #include <iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include "function_for_LinkStack.h"
    
    using namespace std;
    
    int main()
    {
        TestLinkStack();
    
        return 0;
    }
    View Code

    function_for_LinkStack.h:

    #ifndef FUNCTION_FOR_LINKSTACK_H_INCLUDED
    #define FUNCTION_FOR_LINKSTACK_H_INCLUDED
    
    /*
        链栈是运算受限的单链表,只能在链表头部进行操作
        链表的头指针就是栈顶
        不需要头节点
        基本不存在栈满的情况
        空栈 相当于 头指针指向空
        插入和删除仅在栈顶出执行
        节点之间的链接方向:(头节点)栈顶->栈底
    */
    
    typedef char ElemType;
    
    typedef struct StackNode{
        ElemType data;      //数据域
        struct StackNode *next;     //指针域
    }StackNode, *LinkStack;
    
    //初始化链栈
    void InitStack(LinkStack &S);
    
    //判空
    int StackEmpty(LinkStack S);
    
    //入栈
    void Push(LinkStack &S, ElemType e);
    
    //出栈
    void Pop(LinkStack &S);
    
    //出栈并获取栈顶元素
    ElemType Pop_with_elem(LinkStack &S);
    
    //获取栈顶元素
    ElemType GetTop(LinkStack &S);
    
    //打印栈中元素(自顶向下)
    void PrintStack(LinkStack S);
    
    //测试
    void TestLinkStack();
    
    #endif // FUNCTION_FOR_LINKSTACK_H_INCLUDED
    View Code

    function_for_LinkStack.cpp:

    #include<stdio.h>
    #include<stdlib.h>
    #include "function_for_LinkStack.h"
    
    //初始化链栈
    void InitStack(LinkStack &S){
        //构造一个空栈,栈顶指针置空
        S=NULL;
    }
    
    //判空
    int StackEmpty(LinkStack S){
        if(S == NULL){
            return 1;
        }else{
            return 0;
        }
    }
    
    //入栈
    void Push(LinkStack &S, ElemType e){
        LinkStack p = (LinkStack)malloc(sizeof(StackNode));     //生成新节点
        p->data = e;        //数据域置为e
        p->next = S;        //将新节点插入栈顶
        S=p;        //修改栈顶指针
    }
    
    //出栈
    void Pop(LinkStack &S){
        //先判断栈是否为空
        if(S == NULL){
            exit(0);
        }
        LinkStack p = S;        //声明新节点指向栈顶
        S = S->next;
        free(p);        //释放临时节点
    }
    
    //出栈并获取栈顶元素
    ElemType Pop_with_elem(LinkStack &S){
        ElemType e;     //存放栈顶元素的数据域
        //先判断栈是否为空
        if(S != NULL){
            exit(0);
        }
        LinkStack p = S;        //声明新节点指向栈顶
        S = S->next;
        e = p->data;
        free(p);        //释放临时节点
        return e;       //返回数据域类型
    }
    
    //获取栈顶元素
    ElemType GetTop(LinkStack &S){
        if(S != NULL){
            return S->data;
        }
    }
    
    //打印栈中元素(自顶向下)
    void PrintStack(LinkStack S){
        LinkStack p = S;        //声明指向栈顶的指针
        while(p != NULL){
            printf("%c ", p->data);     //依次输出每个节点的数据域
            p = p->next;
        }
    }
    
    //测试
    void TestLinkStack(){
        LinkStack S;        //声明栈顶节点
        printf("初始化:
    ");
        InitStack(S);
    
        //入栈
        printf("压入元素:
    ");
        Push(S, 'a');
        Push(S, 'b');
        Push(S, 'c');
        Push(S, 'd');
        Push(S, 'e');
    
        printf("
    获取栈顶元素:%c
    ", GetTop(S));
        printf("
    栈是否为空?%d
    ", StackEmpty(S));
        printf("
    打印栈:
    ");
        PrintStack(S);
    
        printf("
    出栈:
    ");
        Pop(S);
    
        printf("
    获取栈顶元素:%c
    ", GetTop(S));
        printf("
    栈是否为空?%d
    ", StackEmpty(S));
        printf("
    打印栈:
    ");
        PrintStack(S);
    
        printf("
    再压入新元素:
    ");
        Push(S, 'f');
    
        printf("
    栈是否为空?%d
    ", StackEmpty(S));
        printf("
    打印栈:
    ");
        PrintStack(S);
    
        printf("
    获取栈顶元素:%c
    ", GetTop(S));
    }
    View Code

    运行结果:

  • 相关阅读:
    移动性能测试 | 持续集成中的 Android 稳定性测试
    iOS 测试 | iOS 自动化性能采集
    Google 测试总监聊如何经营成功的测试职业生涯
    浅谈一下可扩展性网站架构设计
    一条SQL执行慢的原因有哪些
    为什么在做微服务设计的时候需要DDD?
    是时候拥抱.NET CORE了
    MySql多表查询优化
    九种高性能可用高并发的技术架构
    HTTP协议总结
  • 原文地址:https://www.cnblogs.com/CPU-Easy/p/11722036.html
Copyright © 2020-2023  润新知