zoukankan      html  css  js  c++  java
  • 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

    运行结果:

  • 相关阅读:
    20182324 2019-2020-1 《数据结构与面向对象程序设计》实验6报告
    20182324 2019-2020-1 《数据结构与面向对象程序设计》实验5报告
    20182324 2019-2020-1 《数据结构与面向对象程序设计》第6周学习总结
    Git fetch和git pull的区别
    第6章 线索二叉树
    第三章 线性表---链式存储结构(静态链表)
    第6章 树---二叉树
    第6章 树
    第4章 栈与队列-----栈
    第4章 栈与队列-----队列
  • 原文地址:https://www.cnblogs.com/CPU-Easy/p/11722036.html
Copyright © 2011-2022 走看看