棧 (stack)

stack_1

stack 是一種後進先出 ( LIFO ) 的數據結構,它對外只開放一個叫做棧頂的口,數據從棧頂入,也從棧頂出,也不允許有遍歷的行爲。

概述

stack_2
棧是一種運算受限的序列式容器,它的行爲被限定在只能在一端進行增刪操作,我們把這一端稱爲棧頂,相對的另一端爲棧底。

棧的插入 (push()) 操作又被稱爲 “入棧” ,新來的數據元素只能被插到棧頂。刪除 (pop()) 操作又稱爲“出棧”,出棧時棧頂的一個數據元素被刪除。除此之外,棧還提供訪問棧頂數據元素(top())的操作,獲取棧大小 (size()) 的操作,判斷棧是否爲空 (empty()) 的操作。

以上所述就是 STL (在 c++98 和 c++11 中還有其它操作)中有關棧的所有操作。

棧的操作

  • push()

stack_3

如上圖所示,棧的插入操作中,最後一個插入的元素總是置於棧頂。

  • pop()

stack_4

刪除操作總是刪掉最後被插入的數據元素。

  • top()

stack_5

top()操作返回位於棧頂的數據元素。

適配器模式

手機的充電電壓爲 5v, 而我國家庭用電的標準電壓是 220v,如何讓家庭電源能給手機充電呢,我們可以引入一個電源適配器,這樣 220v的家庭電壓即可給手機充電,不僅如此,我們還可以引入更多不同電壓的適配器以滿足給各種不同電壓的電器供電。而在這其中,電源適配器扮演了一箇中轉的角色。

在軟件開發中,我們有時也會遇到類似的情況,這時我們需要引入一個和電源適配器類似的稱爲適配器 (adpaters)的模式,處理程序接口不兼容的情況。

實際上,STL 中的 stack 就是一個適配器, 在 STL 中它的源碼如下:

template <class T, class Sequence = deque<T> >
class stack{

...

protected:
  Sequence c;
public:
  bool empty() const { return c.empty(); }
  size_type size() const { return c.size(); }
  reference top() { return c.back(); }
  const_reference top() const { return c.back(); }
  void push(const value_type& x) { c.push_back(x); }
  void pop() { c.pop_back(); }
};

...

從源碼中我們看到,棧的插入、刪除操作只是簡單的調用的模板參數的尾插、尾刪操作。

棧以某種既有的容器 (默認爲deque) 爲底部結構,將其接口封裝,使之符合 “後進先出” 的特性。deque是一個雙向開口的容器,以它作爲棧的底部結構,將其某一端的插入和刪除操作封裝暴露給用戶,而屏蔽掉其它操作,即可實現一個棧。 所以,嚴格來說,棧是一個適配器而非容器。

事實上,任何具有在某一端執行插入和刪除操作的序列式容器都可以作爲棧的底部結構,而這種方法的實現只需給它一個模板參數即可。

下面是以 vectorlist 作爲底部結構的 stack

stack_6

適配器作爲一種設計模式,被廣泛用於軟件開發中。上述的 stack 是某個類的適配器,除此之外,還有迭代器的適配器、仿函數的適配器,它們分別用於實現某些特定的功能,相關介紹請關注後序博客。

——謝謝!


參考資料

【作者:果凍 http://blog.csdn.net/jelly_9

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章