《STL源码剖析》学习笔记——第四章:序列式容器 stack和queue_Still_Believe_的博客-程序员秘密___stl_null_tmpl_args

技术标签: stack  STL源码剖析学习笔记  queue  数据结构  

目录

1. stack

1.1 stack概述

1.2 stack 完整定义

1.3 以list作为stack的底部容器

2. queue

2.1 queue概述

2.2 queue 完整定义

2.3 以list作为queue的底部容器


1. stack

1.1 stack概述

stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口。stack允许新增元素,移除元素、取得最顶端元素,但不允许有遍历行为。若以deque为底部结构并封闭其头端开口,便轻而易举地形成了一个stack。同时,也可以使用list作为底层实现,它也是具有双向开口的数据结构。由于stack系以底部容器完成其所有工作,而具有这种“修改某物接口,形成另一种风貌”之性质者,称为adapter(配接器)。因为stack的所有元素的进出都必须符合“先进后出”的条件,即只有stack顶端的元素,才会被外界取用,所以stack不提供走访功能,也不提供迭代器。

1.2 stack 完整定义

SGI STL以deque作为缺省情况下的stack底部结构。

template<class T, class Sequence = deque<T> >
class stack{
	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 e ; //底层容器
public :
	//以下完全利用Sequence c 的操作,完成stack的操作
	bool empty() const {return c.empty() ;} 
	size_type size() {return c.size();}
	reference top() {return c.back();}
	const_reference top() const {return c.back();}
	//deque是两头可进出,stack是末端进,末端出。
	void push(const value_type& x) {c.push_back(x) ;}
	void pop() {c.pop_back() ;}
	
} ;

1.3 以list作为stack的底部容器

#include <stack>
#include <list>
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    stack<int, list<int>> istack;
    //stack<int> istack; //缺省时使用deque
    istack.push(1);
    istack.push(3);
    istack.push(5);
    istack.push(7);

    cout << istack.size() << endl;   //4
    cout << istack.top() << endl;    //7

    istack.pop();
    cout << istack.top() << endl;    //5
    istack.pop();
    cout << istack.top() << endl;    //3
    istack.pop();
    cout << istack.top() << endl;    //1
    cout << istack.size() << endl;   //1
	
	return 0;
}

2. queue

2.1 queue概述

queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口。queue允许新增元素、移除元素、从最底端加入元素、取得最顶端元素,但不允许遍历行为,也不提供迭代器。若以deque为底部结构并封闭其头端入口和尾部出口,便轻而易举地形成了一个queue。同时,也可以使用list作为底层实现,它也是具有双向开口的数据结构。

2.2 queue 完整定义

SGI STL以deque作为缺省情况下的queue底部结构。

template<class T, class Sequence = deque<T> >
class queue{
	
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 :
	//以下完全利用Sequence c的操作,完成queue的操作
	bool empty() const {return c.empty();}
	size_type size() const {return c.size();}
	reference front() const {return c.front();}
	const_reference front() const {return c.front();}
	//deque是两头可进出,queue是末端进,前端出。
	void push(const value_type &x) {c.push_back(x) ;} 
	void pop() {c.pop_front();}
} ;

2.3 以list作为queue的底部容器

#include <queue>
#include <list>
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    queue<int, list<int>> iqueue;
	//queue<int> iqueue; //缺省时使用deque
    iqueue.push(1);
    iqueue.push(3);
    iqueue.push(5);
    iqueue.push(7);

    cout << iqueue.size() << endl;   //4
    cout << iqueue.front() << endl;  //1

    iqueue.pop();
    cout << iqueue.front() << endl;   //3
    iqueue.pop();
    cout << iqueue.front() << endl;   //5
    iqueue.pop();
    cout << iqueue.front() << endl;   //7
    cout << iqueue.size() << endl;   //1
	
	return 0;
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu_15952103/article/details/109542597

智能推荐

HRBUST - 2040 二叉树的遍历(由前序遍历和中序遍历推出后序遍历)___meteor的博客-程序员秘密

原题#include#includeusing namespace std; int n, pre[110], in[110], post[110], cnt=0;int find(int ist, int ied, int target){ for(int i=ist; i<ied; i++) if(in[i]==target) return i;}void po

在windows上查看内存页大小,磁盘块大小方法_windows 内存页大小__令狐大侠_的博客-程序员秘密

当我们在网上阅读关于操作系统磁盘块大小(4k)和内存页(64k),都不知道如何去验证这个大小到底是多少,今天发现一种简单的测试windows的磁盘块大小,和内存页大小测试方法,不用反汇编跟踪调试代码,即通过snmp协议即可查看,怎么配置snmp和snmp客户端操作我就不讲了,网上有很多资料 ,这里只给出关键的命令与返回值1.查看本机当前存储(各个磁盘,内存)snmpwalk -v 2c -c ...

Android S: SurfaceFlinger指Surface.java的用途_月山知了的博客-程序员秘密

Handle onto a raw buffer that is being managed by the screen compositor.Surface是一个句柄,该句柄是指向由屏幕合成器管理的原始缓冲。A Surface is generally created by or from a consumer of image buffers (such as aSurface通常被图像缓冲区的消费者创建或来自于其。{@link android.graphics.SurfaceTexture},

java二维码之生成与解析_/9j/4aaqskzjrgabagaaaqabaad/2wbdaaggbgcgbqghbwcjcq_慕容潇湘的博客-程序员秘密

1.引入依赖 &lt;dependency&gt; &lt;groupId&gt;com.google.zxing&lt;/groupId&gt; &lt;artifactId&gt;javase&lt;/artifactId&gt; &lt;version&gt;3.0.0&lt;/version&gt...

2.2.4 操作系统之作业/进程调度算法(FCFS先来先服务、SJF短作业优先、HRRN高响应比优先)_BitHachi的博客-程序员秘密

文章目录0.思维导图1.先来先服务---FCFS2.短作业优先---SJF3.高响应比优先---HRRN4.三种算法的对比和总结0.思维导图1.先来先服务—FCFSFirst come first sever2.短作业优先—SJFShortest Job First非抢占式—SJF抢占式—SJF(SRTN)注意几个细节3.高响应比优先—HRRNH...

随便推点

android 8.0 Autofill Framework (自动填充框架)_weixin_33872660的博客-程序员秘密

android 8 时 增加了一个自动填充框架,它是可以是我们在填写表单是更加容易减少出错,还可以我们减少填写表单的时间,填写表单是一项耗时且容易出错的任务,用户可能很容易对需要这些类型任务的应用感到沮丧,自动填充框架通过提供以下优势来改善用户体验:更少的时间用于填充字段 自动填充功能可以帮助用户避免重新输入信息最大限度地减少用户输入错误 打字很容易出错,特别是在移动设备中删除输入信息的必要...

瑞丽评出的年度最好用化妆品~~转了以后就不用找啦_释迦呼呼的博客-程序员秘密

瑞丽评选:       最满意洗面奶:  1.露得清 深层净化洗面乳(性价比超高啊~)   2.Cetaphil 洗面奶  3.佰草集 平衡洁面乳  最满意洁面皂:  1.DHC 纯榄滋养皂  2.Clinique 温和洁面皂  3.清肌精 洁面皂(推荐5星~比洗面奶还好用!)  最满意去角质产品:  1.ZA 去角质霜  2.clarins 深层清洁去角质霜  3.ST.IVES 圣艾芙 杏子磨

RabbitMQ集群创建_weixin_33726318的博客-程序员秘密

环境:OS:CentOS6.75RabbitMQ Vervison :3.6.5节点:node1 : mq01 172.16.42.128node2: mq02 172.16.42.135配置:1、两台机器上都安装RabbitMQ这里的安装包括socat、Erlang、rabbitmq-server包的安装,已经环境变量和c...

ambari汉化、UI、二次开发_ambari 2.6改成中文_大笨笨笨的博客-程序员秘密

这个翻译文件在我的电脑里,现在固态硬盘有问题开不了机,此文件我提供给过长沙智能驾驶研究院有限公司的员工。整体操作步骤我保存在OneNote里面,到时在整理一下写个博客。...

操作系统学习笔记以及个人见解_会写代码的花城的博客-程序员秘密

操作系统王道考研操作系统课程笔记以及一些个人见解概念、功能、目标最基础的:裸机(纯硬件)(需要学习计算机组成原理)然后:裸机+操作系统 就是我们新买的电脑了然后:安装应用程序这些我们都知道:那什么是操作系统?抄别人的话就是:1.负责管理协调硬件、软件等计算机资源的工作2.为上层的应用程序、用户提供简单易用的服务(我们觉得windows亲切)3.操作系统是系统软件、不是硬件用大白话,大多数人你只有装了操作系统,你才会用,你才能打游戏,用电脑上网。有点像我们要做Java开发,就要有JK

Python 笔记(15)— itertools 模块 chain、accumulate、compress、drop、take、repeat 等函数使用_python accumulate initial_wohu1104的博客-程序员秘密

Python 内置的 itertools 模块使用了 yield 生成器。1. chain 拼接迭代器chain 函数实现元素拼接,原型如下,参数 * 表示可变的参数:chain(*iterables)使用方法:In [15]: from itertools import chainIn [16]: a = chain(['This', 'is'], ["python", "q......

推荐文章

热门文章

相关标签