stack概述
stack是一种先进先出的数据结构。它只能有一个出口。stack允许新增元素、移除元素、取得最顶端元素。但除了最顶端元素外,没有任何其他方法可以存取stack的其他元素。换言之,stack不允许有遍历行为。
将新元素推入stack的操作称为push,将元素推出stack的操作称为pop。
stack定义完整列表
以某种既有容器作为底部结构,将其接口改变,使之符合“先进先出”的特性,形成一个stack,是很容易做到的。deque是双向开口的数据结构,若以deque为底部结构并封闭其头端开口,便轻而易举地形成一个stack。因此,SGI STL便以deque作为缺省情况下的stack底部结构 ,stack的实现因而非常简单,源代码十分简短。
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() {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没有迭代器
stack所有元素的进出都符合“先进先出”的条件,只有stack顶端的元素,才有机会被外界取用。stack不能提供走访功能,也不提供迭代器。
以list作为stack的底层容器
除了deque之外,list也是双向开口的数据结构。上述stack源代码中使用的底层容器的函数有empt,size,back,push_back,pop_back,凡此种种,list都具备。因此,list为底部结构并封闭其头端开口,一样能够轻而易举形成一个stack。
using namespace std; int main(){ stack<int, list<int>> istack; istack.push(1); istack.push(3); istack.push(5); cout << istack.size() << endl; //3 cout << istack.top() << endl;//5 istack.pop(); cout << istack.top() << endl;//3 cout << istack.size() << endl;//2 system("pause"); return 0; }
queue
queue概述
queue是一种先进先出(First In FirstOut,FIFO)的数据结构,它有两个出口。queue允许新增元素、移除元素、从最底端加入元素、取得最顶端元素,但不允许遍历行为。
queue定义完整列表
SGI STL以deque作为缺省情况下的queue底部结构。
template<class T, class Sequence = deque<T> > class queue{ 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的操作,完成queue的操作 bool empty() const {return c.empty();} size_type size() const {return c.size();} reference front() const {return c.front();} const_reference front() const {return c.front();} //deque是两头可进出,queue是末端进,前端出。 void push(const value_type &x) {c.push_back(x) ;} void pop() {c.pop_front();} } ;
queue没有迭代器
queue所有元素的进出都必须符合“先进先出”的条件,只有queue顶端的元素,才有机会被外界去用。queue不提供遍历功能,也不提供迭代器。
以list作为queue的底层迭代器
using namespace std; int main(){ queue<int, list<int>> iqueue; iqueue.push(1); iqueue.push(3); iqueue.push(5); cout << iqueue.size() << endl; //3 cout << iqueue.front() << endl;//1 iqueue.pop(); cout << iqueue.front() << endl;//3 cout << iqueue.size() << endl;//2 system("pause"); return 0; }