stack是一种后进先出(last in first out)的数据结构。它只有一个出口,如图所示。stack允许新增元素,删除元素,取得最顶端元素。但除了最顶端外,没有其他任何地方可以存储stack的其他元素,换言之,stack不允许有遍历行为。

将元素推入stack的操作称为push, 将元素推出stack的操作称为pop.

  为什么将stack称为适配器呢?我们先来看看适配器是怎么定义的。具有这种“修改某物接口,形成另一种风貌”之性质者,称为adapter(适配器)。换言之,由于stack的性质,可以使用vector或deque或list为底部结构进行一定的修改,轻易形成一个stack.

  来看看stack的模板声明:

template<class T, class Sequence = deque<T>>
class stack {
// …
protected:
    Sequeue c;  //底层容器
public:
   bool empty() const  { return  c.empty(); }    size_type size() const { return  c.size(); }
    reference top() { return  c.back(); }
    const_reference top() { return  c.back(); }
    void push(const value_type& x) { c.push_back(x); }
    void pop() { c.pop_back(); }
};

  stack有2个模板参数,第二个Sequence(底层容器)默认的为deque。当然如果我们需要使用vector或list的话,必须自己指定出来。

  测试代码:

#include <stack>
#include <list>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
//  stack<int, vector<int>> mystack;      // 底层容器使用vector
//  stack<int, deque<int>> mystack;       // 底层容器使用deque (默认情况下)
    stack<int, list<int>> mystack;        // 底层容器使用list

    mystack.push();
    mystack.push();
    mystack.push();
    mystack.push();
    mystack.push();

    cout << mystack.size() << endl;
    cout << mystack.top() << endl;      

    mystack.pop();
    cout << mystack.top() << endl;
    mystack.pop();
    cout << mystack.top() << endl;
    mystack.pop();
    cout << mystack.top() << endl;      

    cout << mystack.size() << endl;     

    ;
}

  queue(队列)是一种先进先出(first in first out)的数据结构。他有两个端口,如下图所示。queue允许新增元素,删除元素,从最底端加入元素,取得最顶端元素等,但除了最底端可以加入,最顶端可以取出外,没有任何其他方法可以存取queue的其他元素。换言之,queue不允许有遍历行为。

  将元素推入queue的操作称为push, 将元素推出queue的操作称为pop.

  来看看queue的模板声明:

template<class T, class Sequence = deque<T>>
class queue {
// …
protected:
    Sequeue c;  //底层容器
public:
   bool empty() const  { return  c.empty(); }
    size_type size() const { return  c.size(); }
    reference front() { return  c.front(); }
    const_reference front() { return  c.front(); }
    reference back() { return  c.back(); }
    const_reference back() { return  c.back(); }
    void push(const value_type& x) { c.push_back(x); }
    void pop() {c.pop_front(); }
};

  由于queue的结构性质,无法使用vector作为其底层容器(由于效率问题,vector类并未定义相关front函数),我们可以使用deque(默认)和list作为它的底层容器。  

  测试代码:

#include <queue>
#include <list>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{

 // queue<int, deque<int>> myque;  // 使用deque作为底层容器(默认)
    queue<int, list<int>> myque;   // 使用list作为底层容器

    myque.push();
    myque.push();
    myque.push();
    myque.push();
    myque.push();

    cout << myque.size() << endl;
    cout << myque.front() << endl;      

    myque.pop();
    cout << myque.front() << endl;
    myque.pop();
    cout << myque.front() << endl;
    myque.pop();
    cout << myque.front() << endl;      

    cout << myque.size() << endl;       

    ;
}

  特别注意,由于stack,queue的特性,它们没有迭代器。

STL容器适配器 stack, queue的更多相关文章

  1. STL容器(Stack, Queue, List, Vector, Deque, Priority_Queue, Map, Pair, Set, Multiset, Multimap)

    一.Stack(栈) 这个没啥好说的,就是后进先出的一个容器. 基本操作有: stack<int>q; q.push(); //入栈 q.pop(); //出栈 q.top(); //返回 ...

  2. STL之容器适配器stack的实现框架

    说明:本文仅供学习交流,转载请标明出处,欢迎转载! 一提到适配器(adapter).我们就想到了早期用电话线上网所用的调制解调器,俗称"猫"."猫"的作用是实现 ...

  3. 容器适配器(一):queue

    除了标准的顺序容器外,STL还提供了3种容器适配器,queue,priority_queue和stack 适配器是对顺序容器的包装,它的作用是简化接口. queue接口十分的简单,只有8个方法.再加上 ...

  4. c++ STL容器适配器

    一.标准库顺序容器适配器的种类     标准库提供了三种顺序容器适配器:queue(FIFO队列).priority_queue(优先级队列).stack(栈)   二.什么是容器适配器     &q ...

  5. STL源码剖析——序列式容器#4 Stack & Queue

    Stack stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口,元素的新增.删除.最顶端访问都在该出口进行,没有其他位置和方法可以存取stack的元素. ...

  6. 容器适配器————stack

    只能访问 stack 顶部的元素:只有在移除 stack 顶部的元素后,才能访问下方的元素. 堆栈操作 top():返回一个栈顶元素的引用,类型为 T&.如果栈为空,返回值未定义. push( ...

  7. STL容器分析--stack

    stack,顾名思义,表示栈,先进后出.

  8. 容器适配器(stack、 queue 、priority_queue)源码浅析与使用示例

    一.容器适配器 stack queue priority_queue stack.queue.priority_queue 都不支持任一种迭代器,它们都是容器适配器类型,stack是用vector/d ...

  9. Stack&&Queue

    特殊的容器:容器适配器 stack     queue     priority_queue:vector+堆算法---->优先级队列 stack:     1.栈的概念:特殊的线性结构,只允许 ...

随机推荐

  1. 实验1_IPv6地址配置

    IPv6地址配置 实验任务 (1)掌握如何在路由器及PC上配置IPv6地址 (2)掌握如何用IPv6 ping命令进行IPv6地址可达性检查 (3)掌握如何用命令来查看IPv6地址配置 实验过程 在R ...

  2. [Thinking in Java]Nothing but Java

    1 对象(Double Elephants) 1.1 抽象 万物皆对象.什么东西都可以抽象成属性和方法,达到可重用的目的. 对象之间交流靠发送消息.就是通过调用某个特定对象的方法来达到消息传递的目的. ...

  3. Http中 Post和 Get的区别

    1.表面上的区别 1.GET在浏览器回退时,是无害的,而Post会再次提交请求 2.Get产生的Url地址会被Bookmark,而Post不会 3.Get请求会被浏览器主动Cache,而Post不会, ...

  4. (转) Deep Learning Resources

    转自:http://www.jeremydjacksonphd.com/category/deep-learning/ Deep Learning Resources Posted on May 13 ...

  5. 线程安全及Python中的GIL

    线程安全及Python中的GIL 本博客所有内容采用 Creative Commons Licenses 许可使用. 引用本内容时,请保留 朱涛, 出处 ,并且 非商业 . 点击 订阅 来订阅本博客. ...

  6. gzip压缩及测试方法【转载】

    Nginx开启Gzip压缩大幅提高页面加载速度 http://www.veryhuo.com/a/view/51706.html 刚刚给博客加了一个500px相册插件,lightbox引入了很多js文 ...

  7. 针对web高并发量的处理

    针对web高并发量的处理 针对高并发量的处理 一个老生常谈的话题了 至于需要运维支持的那些cdn.负载均衡神马的就不赘述了 你们都懂的 虫子在此博文只讲一些从程序角度出发的一些不错的解决方案. 至于从 ...

  8. 怎样让SoapHttpClientProtocol不使用系统默认代理

    方法很简单,但找起来很难. 使用SoapHttpClientProtocol类的Proxy属性. 不能设空值,必须设一个新值. 赶脚底层在链接的时候会判断这个属性是不是null,如果null就会用默认 ...

  9. Beta版本冲刺——day5

    No Bug 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 站立式会议 今日计划表 人员 工作 ...

  10. TFS下的源代码控制

    以下主要描述了: TFS源代码控制系统的基本场景 如何把一个项目添加到源代码管理中 如何与服务器同步 如何做Check-In 如何做分支与合并 什么是上架与下架 我们知道工作项是项目管理的基本元素,但 ...