1. 程式人生 > 其它 >SGI STL棧stack

SGI STL棧stack

目錄

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;
}