栈的数组实现与链表实现

栈的说明


栈是一种基本的数据结构。在栈中,被删除的元素是最近被插入的元素,实现的是一种后进先出(last-in, first-out, LIFO)的策略。

改变栈中元素的操作方法只有两个——push与pop。push是把元素推入栈底,pop是把元素从栈顶弹出。


下面是push和pop的过程

栈的数组实现与链表实现_第1张图片

图片来自《Data Structures and Program Design In C++》


数组实现


数组实现的思想很简单。利用一个变量count来记录栈顶,然后对数组进行操作。

栈的数组实现与链表实现_第2张图片

图片来自《Data Structures and Program Design In C++》


template 
class Stack {
private:
    static const int maxstack = 10;
    T entry[maxstack];
    int count;
    int stackSize;

    bool full() const {
      return stackSize == maxstack;
    }

public:
    Stack() : count(0), stackSize(0) {
      for (int i = 0; i < maxstack; i++)
        entry[i] = T();
    }

    void push(const T &val) {
      if (!full()) {
        entry[count] = val;
     ++count;
      ++stackSize;
      }
    }

    void pop() {
      if (!empty()) {
        --count;
        --stackSize;
      }
    }

    T top() const {
      if (!empty())
        return entry[count - 1];
    }

    bool empty() const {
      return stackSize == 0 && count == 0;
    }

    int size() const {
      return stackSize;
    }
};

链表实现

链表实现是以一个top_node作为链表的表头,标记栈顶,在此进行插入和删除操作

栈的数组实现与链表实现_第3张图片

图片来自《Data Structures and Program Design In C++》


栈的数组实现与链表实现_第4张图片

图片来自《Data Structures and Program Design In C++》


栈的数组实现与链表实现_第5张图片

图片来自《Data Structures and Program Design In C++》


template 
class Stack {
private:
  // 声明结点的结构体
 struct Node {
    T data;
    Node *next;
  };

private:
  Node *top_node;
  int stackSize;

public:
  Stack() : top_node(NULL), stackSize(0) { }

  ~Stack_List() {
    while (!empty())
      pop();
  }

 // push将新来的元素添加到链表头
  void push(const T &val) {
    Node *new_node = new Node;
    new_node->data = val;
    new_node->next = top_node;
    top_node = new_node;
    ++stackSize;
  }

  // pop把链表头即栈顶的元素弹出
  void pop() {
    if (!empty()) {
      Node *temp = top_node;
      top_node = top_node->next;
      delete temp;
      --stackSize;
    }
  }

  T top() const {
    return top_node->data;
  }

  bool empty() const {
    return stackSize == 0 && top_node == NULL;
  }

  int size() const {
    return stackSize;
  }
};

简单测试

#include 
using namespace std;

int main() {
  Stack s;
  for (int i = 0; i < 11; i++)
    s.push(i);
  cout << s.size() << endl;
  while (!s.empty()) {
    cout << s.top() << " ";
    s.pop();
  }
  cout << endl;
  return 0;
}

数组实现的栈的测试结果


由于设定栈的最大容量为10,因此只有10个元素在栈内


链表实现的栈的测试结果


由于链表的长度是可增长的,因此能有11个元素在栈内


参考书籍


《Data Structures and Program Design In C++》

你可能感兴趣的:(数据结构与算法)