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() //返回栈顶元素

    未完待续……

  • 相关阅读:
    java--静态变量
    java--IO
    java--集合
    java--线程
    java——图形用户界面编程-——布局
    java--图形用户界面编程
    String类
    JAVA-继承和接口
    JAVA——构造方法
    JAVA——接口
  • 原文地址:https://www.cnblogs.com/sdutzxr/p/12232004.html
Copyright © 2011-2022 走看看