STL源码剖析----stack

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值