stack源碼

stack概述ios

stack是一種先進後出的數據結構,它只有一個出口,容許新增元素、移除元素、取得最頂端元素,但每次只能處理頂端元素,也就是說,stack不容許遍歷行爲。數據結構

stack定義函數

以某種既有容器做爲底部結構,將其接口改變,使之符合"先進後出"的特性,造成一個stack,是很容易作到的,deque是雙向開口的數據結構,若以deque以底部結構並封閉其開頭,便輕易舉起造成一個stack。spa

因爲stack系以底部容器完成其全部工做,而具備這種性質,稱爲adapter(配接器),所以,STL stack每每不被歸類爲container(容器),而被歸類爲container adapter。code

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: 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; protected: Sequence c; //底層容器
public: //如下徹底利用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();} }; 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,Sequence>& y){ return x.c<y.c; }

stack沒有迭代器blog

stack只能處理其頂端元素,不能隨機訪問,因此不提供迭代器。接口

以list做爲stack的底層容器源碼

除了deque以外,list也是雙向開口的數據結構。上述stack源碼中使用的底層容器的函數有empty、size、back、push_back、pop_back,list也都具有,所以,若以list爲底部結構並封閉其頭端開口,同樣可以造成一個stack,示範以下:it

#include<iostream> #include<stack> #include<list> #include<algorithm>
using namespace std; 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; }
相關文章
相關標籤/搜索