zoukankan      html  css  js  c++  java
  • 【数据结构】【C++】堆栈的实现与应用 SDUT

    堆栈(Stack)

    参考浙大版《数据结构(第2版)》

    • 堆栈可以认为是具有一定约束的线性表,插入和删除的操作都在栈顶的位置,先进入的元素将在后进入的元素之后取出,与生活中的桶类似,故又称为后入先出(Last In First Out, LIFO)表。

    非STL的堆栈实现:

    • 手写的堆栈主要有以下几种基本操作:
    • Stack CreateStack(int MaxSize):生成空堆栈,其最大长度为MaxSize;
    • bool IsFull(Stack S):判断堆栈S是否已满。若S中的元素个数等于MaxSize则返回true,否则返回false;
    • bool Push(Stack S, ElememtType X):将元素X压入堆栈。若堆栈已满,返回false;否则将元素X插入到堆栈S栈顶处并返回true;
    • bool IsEmpty(Stack S):判断堆栈S是否为空,若是返回true;否则返回false;
    • ElementType Pop(Stack S):删除并返回栈顶元素,若堆栈为空则返回错误信息;

    堆栈的顺序储存实现

    • 顺序栈类型定义如下(以整数为例):
    typedef int ElementType;
    typedef int Position;
    typedef struct SNode * Stack;
    struct SNode
    {
        ElementType * Date;
        Position Top;
        int MaxSize;
    };
    
    • 顺序栈以上操作的代码实现:
    //生成空堆栈
    Stack CreateStack(int MaxSize)
    {
        Stack S = (Stack)malloc(sizeof(struct SNode));
        S ->Date = (ElementType *)malloc(MaxSize * sizeof(ElementType));
        S ->Top = -1;
        S ->MaxSize = MaxSize;
        return S;
    }
    
    //判断堆栈是否已满
    bool IsFull(Stack S)
    {
        return (S ->Top == S ->MaxSize);
    }
    
    //圧栈操作
    bool Push(Stack S, ElementType x)
    {
        if(IsFull(S)) return 0;
        else 
        {
            S ->Date[++(S ->Top)] = x;
            return 1;
        }
    }
    
    //判断堆栈是否为空
    bool IsEmpty(Stack S)
    {
        return (S ->Top == -1);
    }
    
    //弹出栈操作
    ElementType Pop(Stack S)
    {
        if(IsEmpty(S)) return ERROR;
        else 
        {
            return (S ->Date[(S ->Top)--]);
        }
    }
    

    堆栈的链式存储实现

    • 堆栈的链式存储由链表实现,因此不存在堆栈大小的问题,故没有判断栈满的操作;
    • 链式栈的类型声明:
    typedef int ElementType;
    typedef struct SNode * Stack;
    struct SNode 
    {
        ElementType Data;
        Stack Next;
    };
    
    • 基本操作的代码实现:
    //生成空堆栈
    Stack CreateStack(Stack S)
    {
        S = (Stack)malloc(sizeof(struct SNode));
        S ->Next =NULL;
        return S;
    }
    
    //圧栈操作
    void Push(Stack S, ElementType X)
    {
        Stack t = (Stack)malloc(sizeof(struct SNode));
        t ->Data = X;
        t ->Next = S ->Next;
        S ->Next = t;
    }
    
    //判断栈是否为空
    bool IsEmpty(Stack S)
    {
        return (S ->Next == NULL);
    }
    
    //弹出栈
    ElementType Pop(Stack S)
    {
        if(IsEmpty(S)) 
        {
            return ERROR;
        }
        else
        {
            Stack TopElem = S ->Next;
            int Top = TopElem ->Data;
            S ->Next = TopElem ->Next;
            free(TopElem);//注意要及时释放内存
            return Top;
        }
    }
    

    STL中的堆栈

    在C++的STL中自带堆栈,一般情况下使用STL较多

    • 头文件:
    #include <stack>
    
    • 基本操作:
    • stacks; //生成空堆栈
    • s.empty() //若堆栈为空则返回真,否则返回假
    • s.pop() //移除栈顶元素
    • s.push(item) //在栈顶增加元素item
    • s.size() //返回栈中元素数目
    • s.top() //返回栈顶元素

    未完待续……

  • 相关阅读:
    << 和>> 的计算公式
    死锁面试题(什么是死锁,产生死锁的原因及必要条件)
    SpringBoot的注解:@SpringBootApplication注解 vs @EnableAutoConfiguration+@ComponentScan+@Configuration
    SpringBoot入门-15(springboot配置freemarker使用YML)
    shiro 登录
    springMVC RedirectAttributes
    IDEA3.5最新版激活码
    求递归算法时间复杂度:递归树
    渐进复杂度
    PL/SQL注册码
  • 原文地址:https://www.cnblogs.com/sdutzxr/p/12232004.html
Copyright © 2011-2022 走看看