栈的数组实现与链表实现

来源:互联网 发布:音频编辑软件哪个好 编辑:程序博客网 时间:2024/06/07 02:39

栈的说明


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

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


下面是push和pop的过程


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


数组实现


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

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


template <class T>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作为链表的表头,标记栈顶,在此进行插入和删除操作

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


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


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


template <class T>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 <iostream>using namespace std;int main() {  Stack<int> 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++》

0 0
原创粉丝点击