STL容器之stack,queue操作


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也是雙向的容器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM