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. wince5代码整理

    BAT文件语法: @REM 这是注释标识与REM的区别就是在echo on时REM的注释也会显示出来 @REM 设置变量BSP_SMDK2416为2 set BSP_SMDK2416=2 @REM 设 ...

  2. jQuery中的map()方法

    jQuery中map()方法的使用格式为:$(selector).map(callback(index,domElement)). 将在每一个被选元素上执行map()方法中设置的回调函数,在回调函数中 ...

  3. Search Insert Position

    int searchInsert(int* nums, int numsSize, int target) { ; ); ; int mid; while(low<=high){ mid=(lo ...

  4. osx下配置Cocos2d-x 3.x Android开发环境

    配置前需要准备的 首先需要看一下官网文档 http://www.cocos.com/doc/article/index?type=cocos2d-x&url=/doc/cocos-docs-m ...

  5. (转)A Survival Guide to a PhD

    Andrej Karpathy blog About Hacker's guide to Neural Networks A Survival Guide to a PhD Sep 7, 2016 T ...

  6. js 循环切换图片

    function changeLot(){ var minIndex = 1; var maxIndex = 100; var curIndex = 10; var src = $("ul ...

  7. 查看死锁 的存储过程 ,工具存储过程 sp_who_lock

    http://blog.sina.com.cn/s/blog_95b5eb8c010162jp.html if exists (select * from dbo.sysobjects where i ...

  8. Tomcat启动脚本

    记录一个比较好的tomcat启动脚本,截取<OneinStack>,修改如下两个参数即可用. 使用之前修改下面2个参数: #Location of JAVA_HOME (bin files ...

  9. React组件生命周期过程说明

    来自kiinlam github94 实例化 首次实例化 getDefaultProps getInitialState componentWillMount render componentDidM ...

  10. 自动化运维:flask-bootstrap + highstock整合

    1.在flask-bootstrap的base.html模板中加载highstock.js      以下是base.html的源码中,调用js文件的例子. 文件路径:python2.7/site-p ...