数据结构学习——栈

来源:互联网 发布:淘宝网络兼职可信吗 编辑:程序博客网 时间:2024/06/01 08:18

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

  • 概念与性质
    • 一些概念
    • 栈的性质
    • 栈的操作
  • 顺序栈
    • 数组实现
    • vector实现
  • 链式栈


概念与性质

一些概念

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

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

栈的性质

由于栈是一种运算受限的线性表,只允许在表的一端进行插入删除,所以栈具有一些特殊的性质。给定栈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的实现在上一篇博客《数据结构学习——线性表》中,查看上一篇博客


0 0