Stack不允許遍歷,只有一個出口,只允許對最頂端的元素進行操作。
SGI STL默認以deque作為stack的底層結構。
為什么要使用deque作為stack的底層結構呢?因為deque可以很容易的封住其中某個方向的接口,而且deque便於擴容,底層結合了list和vector,比起單一的使用list或者vector來實現stack更加方便高效。
由於stack是依賴底層容器完成其功能的,所以這種“修改某個物件的接口,形成另一種新的接口”的,叫做adapter。
Template<class T, class Sequence=deque<T> >
Class stack
{
Friend bool operator == __STL_NULL_TMPL_ARGS (const stack&,const stack&);
Friend bool operator< __STL_NULL_TMPL_ARGS(const stack&, const stack&);
Public:
//取Sequence底層容器來定義,不需要自己再重新定義這些類型信息
Typedef typename Sequence::value_type value_type;
Typedef typename Sequence::size_type size_type;
Typedef typename Sequence::reference reference;
Typedef typename Sequence::const_reference const_reference;
//deque中的定義是這樣的,利用容器模板類的類型信息定義
//<class T,class Ptr,class Ref>
//Typedef T value_type;
//Typedef Ptr pointer;
//Typedef Ref reference;
//Typedef size_t size_type;
//Typedef ptrdiff_t difference_type;
Protected:
Sequence c; // 底層使用deque來實現數據分配和操作等
Public:
Bool empty() const {return c.empty();}
Size_type size() const {return c.size();}
Reference top(){ return c.back();} //只暴露和top有關的操作
Const_reference top() const {return c.back();}
Void push( const value_type& x) { c.push_back(x);}
Void pop(){c.pop_back();}
};
Template <class T, class Sequence>
Bool operator == (const stack<T,Sequence>& x, const stack<T,Sequence>& y)
{
Return x.c == y.c;
}
Template<class T,class Sequence>
Bool operator<(const stack<T,Sequence>& x, const stack<T,Sequcne>& y)
{
Return x.c<y.c;
}
47 因為stack所有元素都只能在頂部出入,所以不需要遍歷,所以不需要迭代器
48 使用list作為stack的底層容器【這個可以作為參考比較!】
Stack<int> s;
默認情況下,使用sequence=deque<T>,作為stack的頂層容器
如果有容器也支持stack的基本操作的具體實現,如push_back等,也可以作為stack的容器,例如list
#include<stack>
#include<list>
#include<iostream>
#include<algorithm>
Using namespace std;
Int main()
{
Stack<int ,list<int> > istack; //我們平常使用的是默認的Stack<int, deque<int>> istack; 容器默認為deque
Istack.push(1);
Cout<< istack.size()<<endl;
Cout<<istack.top()<<endl;
Istack.pop(); //pop無返回值
Cout<<.istack.top();
}
49 queue
Queue先進先出,有兩個開口,尾部開口只允許入,而頂部開口只允許出,同樣的queue也不允許有遍歷操作,所以也沒有所謂的迭代子,不能訪問到里面的元素嘛
和stack一樣,queue也是使用deque作為其底層容器
Template<class T, class Sequence=queue<T>>
Class queue
{
Friend bool Operator==(const queue<T Sequence>& q1,const queue<T,Sequcne>& q2) ;
Friend bool operator<(..) ;
Public :
Typedef sequence ::value_type value_type ;
Typedef sequence::reference reference;
Typedef sequence::const_reference const_reference;
Protected:
Sequence c;
Public:
Bool empty() const{return c.empty();}
Size_type size() const{return c.size();}
Reference front() {return c.front();}
Const_reference front() const{return c.front();}
Reference back() {return c.back();}
Const_reference back() const{return c.back();}
Void push(const value_type& x){c.push_back(x);}
Void pop(){c.pop_front():}
}
和stack一樣,queue也可以使用list作為底層容器,因為list也是雙向的容器