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. ZipArchive之C++编译和调用

    由于要用到zip的解压,就上网下载了CZipArchive类的源码(还是2000年的),里面有个示例,稍微修改下,就能正常运行. 就高兴地把lib拿出来,放到项目中了.捣鼓了快一个下午了,死活编译不通 ...

  2. android studio入门

    目前的工作是蓝牙相关的,所以最近心血来潮想折腾下Android开发,方便调试自己的固件, 装好Android Studio跟SDK之后,感谢nordic的公开代码,研究了一会,感觉并没有多费劲 相关的 ...

  3. 数迹学——Asp.Net MVC4入门指南(5):从控制器访问数据模型

    MovieController中的方法Index()代码,初认识,应该有很多理解错误的地方,暂时这么记忆吧,待随后修改 Index()代码: @model IEnumerable<MVCMovi ...

  4. Oracle Hints详解

    在向大家详细介绍Oracle Hints之前,首先让大家了解下Oracle Hints是什么,然后全面介绍Oracle Hints,希望对大家有用.基于代价的优化器是很聪明的,在绝大多数情况下它会选择 ...

  5. Unity3D入门

    Unity3D是一款应用广泛的3D游戏引擎,本文主要介绍unity3D的简单应用,安装过程略过. 在游戏的整个开发过程中,游戏界面设计占据非常重要的地位.因为游戏启动后,第一个映入眼帘的就是整个游戏U ...

  6. 网站推广优化(SEO,网站关键字优化,怎么优化网站,如何优化网站关键字)

    网站推广优化教程100条(完整版)下面介绍新手建站推广完美教程,各位根据自己的实际情况酌情选用: 1.准备个好域名.①.尽量在5位数内,当然也不一定,反正要让用户好记.(看个人):②.尽量用顶级的域名 ...

  7. visual studio 调试时遇到 System.BadImageFormatException

    System.BadImageFormatException”类型的未经处理的异常在 未知模块. 中发生 其他信息: 未能加载文件或程序集“SendYourIP.exe”或它的某一个依赖项.生成此程序 ...

  8. 非阻塞socket调用connect, epoll和select检查连接情况示例

    转自http://www.cnblogs.com/yuxingfirst/archive/2013/03/08/2950281.html 我们知道,linux下socket编程有常见的几个系统调用: ...

  9. maven 项目无法发布,无法编译的解决办法

    1 Web Deployment Assembly信息都合理2 重新clear项目,让JAVA代码重新生成.class文件在target目录中

  10. 关于Winform 2.0以后多线程不能更新UI的办法

    DotNet 2.0以后Winform在多线程Debug模式下更新UI会报这个错: 线程间操作无效: 从不是创建控件"XXX"的线程访问它. 解决办法如下: 1.在Winform的 ...