SGI STL棧stack
阿新 • • 發佈:2022-05-08
目錄
stack簡介
棧stack是一種先進後廚(FILO)的資料結構,只有一個出口,即棧頂。stack支援新增元素、移除元素、取得棧頂元素,但都是針對棧頂元素的操作,無法存取其他位置元素。
也就是說,stack不支援不影響棧結構的遍歷操作。
將元素插入stack的操作稱為push,將元素從stack移除(或彈出)的操作稱為pop。
stack資料結構
SGISTL中,stack底層預設實現是依賴於deque(雙端佇列)。封閉deque的一端,只留一端進行新增元素、移除元素、查詢元素的操作。
底層操作完全由其他容器實現,只是修改了deque的介面,稱為adapter(介面卡)。由於stack是以其他底部容器完成所有工作,因此往往不稱為contain(容器),而稱為container adapter(容器介面卡)。
# define __STL_DEPENDENT_DEFAULT_TMPL(_Tp) = _Tp // stack底層容器預設是deque template <class _Tp, class _Sequence __STL_DEPENDENT_DEFAULT_TMPL(deque<_Tp>) > class stack { // __STD_QUALIFIER展開為std::, __STL_NULL_TMPL_ARGS展開為<> friend bool __STD_QUALIFIER operator== __STL_NULL_TMPL_ARGS (const stack&, const stack&); friend bool __STD_QUALIFIER operator< __STL_NULL_TMPL_ARGS (const stack&, const stack&); public: // 定義內嵌型別 typedef typename _Sequence::value_type value_type; typedef typename _Sequence::size_type size_type; typedef _Sequence container_type; typedef typename _Sequence::reference reference; typedef typename _Sequence::const_reference const_reference; protected: _Sequence c; // 底層容器 public: stack() : c() {} explicit stack(const _Sequence& __s) : c(__s) {} // 以下利用Sequence c的操作, 完成stack的操作 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(); } // deque是雙端支援進出, stack只支援尾端進, 尾端出, 從而支援先進後出 void push(const value_type& __x) { c.push_back(__x); } void pop() { c.pop_back(); } }; // 比較兩個stack x, y的所有元素是否相等 template <class _Tp, class _Seq> bool operator==(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y) { return __x.c == __y.c; } // 比較stack x是否小於stack y template <class _Tp, class _Seq> bool operator<(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y) { return __x.c < __y.c; }
stack沒有迭代器
由於stack所有元素必須符合 “先進後出”的規則,只有棧頂元素才能被外部訪問,因此不提供遍歷功能,也不提供迭代器。
以list作為stack底層容器
除了deque,list也是雙向開口的容器,也能作為stack的底層容器。stack要求底層容器支援empty(),size(),front(), back(),push_back(),pop_back()等介面。
以list作為stack底層容器示例:
int main() { stack<int, list<int>> istack; istack.push(1); istack.push(3); istack.push(5); istack.push(7); cout << istack.size() << endl; // 4 cout << istack.top() << endl; // 7 istack.pop(); cout << istack.top() << endl; // 5 istack.pop(); cout << istack.top() << endl; // 3 istack.pop(); cout << istack.top() << endl; // 1 cout << istack.size() << endl; // 1 return 0; }