stack是一种先进后出的数据结构,只有一个出口(末端),stack允许增加元素、移除元素和取得最末端(最顶端)元素,但这些操作都只能在末端进行,除了末端,stack没有办法访问其他位置的元素,没有遍历功能。
把相应的已有的容器作为底部结构,将其接口改变,使之符合stack的特性,就形成一个stack。deque和list都是双向开口的数据结构,相应改变一下可以符合stack的特性,都是可以作为stack的底层容器。SGI STL stack默认底层容器是deque。
stack源码:
template <class T, class Sequence = deque<T> >
class stack {
//__STL_NULL_TMPL_ARGS是定义在 <stl_config.h>中,# define __STL_NULL_TMPL_ARGS <>
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:
//stack下面的这些操作都是借助底层容器的操作来完成
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
//两个函数的区别:
reference top() { return c.back(); } //stack<int> a;a.top();会调用
const_reference top() const { return c.back(); } //const stack<int> a;a.top();会调用
void push(const value_type& x) { c.push_back(x); }
void pop() { c.pop_back(); }
};
//stack的比较实际上就是底层容器的比较,会调用底层容器的重载操作符==、<
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没有迭代器,没有办法遍历,只允许对末端的元素增删查改
list也有 empty, size, back, push_back, pop_back函数,也可以==和<比较,也可以作为stack底层容器
例:stack<int,list > istack;