您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习——栈

2016-01-01 16:31 393 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/tongyunzhao/article/details/50445242

考试前复习下数据结构,把一些知识点整理在这!主要参考了殷人昆主编的《数据结构(用面向对象方法与C++语言描述)》这本书,以及中山大学刘聪老师的课件内容!

  • 顺序栈
  • 链式栈
  • 概念与性质

    一些概念

    栈是只允许在表的末端进行插入和删除的线性表。

    • 栈顶:允许插入和删除的一端
    • 栈底:不允许插入和删除的一端
    • 空栈:栈中没有任何元素的栈

    栈的性质

    由于栈是一种运算受限的线性表,只允许在表的一端进行插入删除,所以栈具有一些特殊的性质。给定栈S=(a1, a2, …, an),则最后加入栈的元素an为栈顶,按a1, a2, …, an的顺序进栈,出栈的顺序则刚好相反,即an先出栈,a1最后出栈。这样的性质可以概括为先进后出(FILO),或者叫后进先出(LIFO),两种说法都可以,但是我比较习惯FILO。

    栈的操作

    栈有几个主要的操作:

    • 建立一个空栈(构造函数Stack());
    • 在栈顶添加一个新元素,如果栈未满(push() );
    • 在栈顶删除一个元素,如果栈不空(pop() );
    • 检查栈是否空(isEmpty());
    • 取得栈顶元素,如果栈不空(Top())。

    栈的抽象数据类型主要有两种存储表示:基于数组的存储表示(顺序栈)和基于链表的存储表示(链式栈)。

    顺序栈

    基于数组的存储表示实现的栈称为顺序栈。

    数组实现

    template <typename T>
    class Stack {
    private:
    const static int MAX_ELEMENT_COUNT = 1000;
    int elementCount;
    T elements[MAX_ELEMENT_COUNT];
    
    public:
    Stack() : elementCount(0) {}
    
    bool isFull() {
    return elementCount >= MAX_ELEMENT_COUNT;
    }
    
    bool isEmpty() {
    return elementCount == 0;
    }
    
    void push(T element) {
    if (isFull()) {
    cout << "The stack is full. Can not push any element now." << endl;
    return;
    }
    elements[elementCount] = element;
    elementCount++;
    }
    
    void pop() {
    if (isEmpty()) {
    cout << "The stack is empty. Can not pop any element now." << endl;
    return;
    }
    elementCount--;
    }
    
    T top() {
    if (isEmpty()) {
    throw runtime_error("No data in stack.");
    }
    return elements[elementCount-1];
    }
    };

    vector实现

    template <typename T>
    class Stack {
    private:
    vector<T> elements;
    
    public:
    Stack() {}
    
    bool isEmpty() {
    return elements.size() == 0;
    }
    
    void push(T element) {
    elements.push_back(element);
    }
    
    void pop() {
    if (isEmpty()) {
    cout << "The stack is empty. Can not pop any element now." << endl;
    return;
    }
    elements.pop_back();
    }
    
    T top() {
    if (isEmpty()) {
    throw runtime_error("No data in stack.");
    }
    return elements[elements.size() - 1];
    }
    };

    链式栈

    基于链表的存储表示实现的栈称为链式栈。

    template <typename T>
    class Stack {
    private:
    LinkedList<T> elements;
    
    public:
    Stack() {}
    
    bool isEmpty() {
    return elements.isEmpty();
    }
    
    void push(T element) {
    elements.addFirst(element);
    }
    
    void pop() {
    if (isEmpty()) {
    cout << "The stack is empty. Can not pop any element now." << endl;
    return;
    }
    elements.removeFirst();
    }
    
    T top() {
    if (isEmpty()) {
    throw runtime_error("No data in stack.");
    }
    return elements.getFirst();
    }
    };

    注:模板类LinkedList的实现在上一篇博客《数据结构学习——线性表》中,查看上一篇博客

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: