您的位置:首页 > 产品设计 > UI/UE

STL学习——Stack/Queue篇

2016-05-06 22:37 507 查看

STL学习——Stack/Queue篇

Stack

概述

stack是一种先进先出的数据结构,只有一个出口,stack允许新增元素,移除元素,取得最顶端元素。但除了最顶端外,没有任何办法可以存取stack其他元素。即不允许遍历行为。

实现

stack实现是以容器为底部结构的,将容器的接口改变,使其符合“先进先出”特性,便形成了一个栈。具体实现可以将底部deque的头端开口封闭,便实现了stack。因为stack具有“修改某物接口,形成另一种风貌”性质,故称为“适配器”。stack被归类为container adapter。

stack中没有迭代器,不提供走访功能。此外,stack还可以使用list作为底层容器。下面是stack的源码分析。

template <class _Tp, class _Sequence>
class stack {
...
public:
typedef typename _Sequence::value_type      value_type;
typedef typename _Sequence::size_type       size_type;
typedef          _Sequence                  container_type;

typedef typename _Sequence::reference       reference;
typedef typename _Sequence::const_reference const_reference;
protected:
_Sequence c;        // 底层容器
public:
// 以下完全利用Squence c操作,完成stack的操作
stack() : c() {}
explicit stack(const _Sequence& __s) : c(__s) {}
// 判断栈空操作
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(); }
// 压栈操作
void push(const value_type& __x) { c.push_back(__x); }
// 弹栈操作
void pop() { c.pop_back(); }
};
// 栈相等操作
template <class _Tp, class _Seq>
bool operator==(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y)
{
return __x.c == __y.c;
}
// 栈小于操作
template <class _Tp, class _Seq>
bool operator<(const stack<_Tp,_Seq>& __x, const stack<_Tp,_Seq>& __y)
{
return __x.c < __y.c;
}
...


Queue

概述

queue是一种先进先出的数据结构。它有两个出口。它允许新增元素,移除元素,从最底端加入元素,取得最顶端元素。除了从最底端加入元素,最顶端去除元素外,没有任何方法存取queue其他元素。即它也不存在遍历操作。

实现

queue也是以容器为底部结构,改变其接口,使其符合先进先出特性,形成queue。其实现可以将deque的低端出口和前端入口封闭,便可轻易实现queue。queue也具有“修改某物接口,形成另一种风貌”性质,故也为配接器。它也被归为容器适配器。它也不存在迭代器,故也不能执行遍历操作。下面是queue的源码分析。

template <class _Tp, class _Sequence>
class queue {
...
public:
typedef typename _Sequence::value_type      value_type;
typedef typename _Sequence::size_type       size_type;
typedef          _Sequence                  container_type;

typedef typename _Sequence::reference       reference;
typedef typename _Sequence::const_reference const_reference;
protected:
_Sequence c;            // 底层容器
public:
queue() : c() {}
explicit queue(const _Sequence& __c) : c(__c) {}
// 判断队列是否为空
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(); }
// deque是两头可进出,queue是末端进,前端出(所有先进者先出)
// 入队操作
void push(const value_type& __x) { c.push_back(__x); }
// 出队操作
void pop() { c.pop_front(); }
};
// 判断队列是否相等
template <class _Tp, class _Sequence>
bool
operator==(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y)
{
return __x.c == __y.c;
}
// 判断队列大小
template <class _Tp, class _Sequence>
bool
operator<(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y)
{
return __x.c < __y.c;
}
...


参考文献

STL源码剖析——侯捷

STL源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stl stack queue