STL概览——栈( stack )、队列( queue )和优先级队列( priority_queue)

栈(stack)

  stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个口,平常在我们写深度优先遍历算法时,,就会用到栈,stack允许我们增加,移除,取得最顶端元素。但是除了最顶端元素之外,没有任何其他方法可以存取stack的其它元素,因此stack不允许有遍历行为。

  以某种既有容器为底层结构,将其接口改变,使之符合 “先进后出” 的特性,形成一个 stack ,是很容易做到的。deque 是双向开口的数据结构,若以 deque为底部结构并封闭其头部端口,便轻而易举形成一个 stack 。因此,SGI STL 便以 deque 作为缺省情况下的 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:stack() : c() {}explicit stack(const _Sequence& __s) : c(__s) {}//以下完全利用_Sequence c 的操作完成 stack 的操作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(); }
};

 

  stack 因为所有元素都必须遵守“先进后出”的条件,只有 stack 顶端的元素,才有机会被外界取用,stack 不提供走访功能,因此没有迭代器。

  当然还可以以 list 作为 stack 底层容器:

  

#include <iostream>
#include <string>
#include <stack>
#include <list>
using namespace std;
int main()
{  //用双向链表作为底层容器
    stack<int, list<int> > temp;for(int i = 0; i < 10; i++){temp.push(i);                //0 1 2 3 4 5 6 7 8 9
    }for(int i = 0; i < 10; i++){printf("%d ", temp.top());    //9 8 7 6 5 4 3 2 1 0 
        temp.pop();}return 0;
}

队列(stack)

  queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口,queue 允许新增元素,移除元素,从最低端加入元素,取得最顶端元素。但除了最底端可以加入,最顶端可以取出外,没有其他任何方法可以存取 queue 的其他元素,因此 queue 不允许有遍历行为,也就是没有迭代器。同栈一样,STL里面默认 deque 作为缺省情况下的 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) {}//以下完全利用 Sequence c 的操作完成queue操作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(); }void push(const value_type& __x) { c.push_back(__x); }void pop() { c.pop_front(); }
};

 

优先级队列(priority_queue)

  priority_queue 是一种具有权值观念的 queue,他允许加入新元素,移除旧元素,审视元素值等功能,同样只支持底部加元素,顶端取元素,除此以外别无其他存取元素途径。但priority_queue 其内部的元素并非按照被推入的次序排列,而是自动依照元素的权值排列,权值越高,排在越前面。缺省情况下,priority_queue 利用max-heap 完成,后者是一个以vector表现的 complete binary tree。max-heap 可以满足 priority_queue 所需要的 “权值从高到低自动地减排序” 的特性。

template <class _Tp, class _Sequence __STL_DEPENDENT_DEFAULT_TMPL(vector<_Tp>),class _Compare__STL_DEPENDENT_DEFAULT_TMPL(less<typename _Sequence::value_type>) >
class priority_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;                    //底层容器_Compare comp;                    //排序规则
public:priority_queue() : c() {}explicit priority_queue(const _Compare& __x) :  c(), comp(__x) {}//以下用到的 make_heap(), push_heap() 和 pop_heap()都是泛型算法//任何一个构造函数都在底层产生一个 implicit representation heap (隐式表述堆)priority_queue(const _Compare& __x, const _Sequence& __s) : c(__s), comp(__x) { make_heap(c.begin(), c.end(), comp); }#ifdef __STL_MEMBER_TEMPLATEStemplate <class _InputIterator>priority_queue(_InputIterator __first, _InputIterator __last) : c(__first, __last) { make_heap(c.begin(), c.end(), comp); }template <class _InputIterator>priority_queue(_InputIterator __first, _InputIterator __last, const _Compare& __x): c(__first, __last), comp(__x) { make_heap(c.begin(), c.end(), comp); }template <class _InputIterator>priority_queue(_InputIterator __first, _InputIterator __last,const _Compare& __x, const _Sequence& __s): c(__s), comp(__x){ c.insert(c.end(), __first, __last);make_heap(c.begin(), c.end(), comp);}#else /* __STL_MEMBER_TEMPLATES */priority_queue(const value_type* __first, const value_type* __last) : c(__first, __last) { make_heap(c.begin(), c.end(), comp); }priority_queue(const value_type* __first, const value_type* __last, const _Compare& __x) : c(__first, __last), comp(__x){ make_heap(c.begin(), c.end(), comp); }priority_queue(const value_type* __first, const value_type* __last, const _Compare& __x, const _Sequence& __c): c(__c), comp(__x) { c.insert(c.end(), __first, __last);make_heap(c.begin(), c.end(), comp);}#endif /* __STL_MEMBER_TEMPLATES */bool empty() const { return c.empty(); }size_type size() const { return c.size(); }const_reference top() const { return c.front(); }void push(const value_type& __x) {//push_heap()是泛型算法,先利用底层的push_back() 将新元素推入末端,再重排heap
        __STL_TRY{c.push_back(__x); push_heap(c.begin(), c.end(), comp);}__STL_UNWIND(c.clear());}void pop(){//pop_heap()是泛型算法,从 heap 内取出一个元素,它并不是真正将元素弹出//而是重排 heap, 然后以底层容器的 pop_back() 取得被弹出的元素  
        __STL_TRY {pop_heap(c.begin(), c.end(), comp);c.pop_back();}__STL_UNWIND(c.clear());}
};

 

  priority_queue 的所有元素进出都有一定规则,只有 queue 顶端的元素,也就是权值最高者,才有机会被外界取用,priority_queue没有迭代器。

  priority_queue 测试如下:

  

#include <iostream>
#include <string>
#include <queue>
#include <list>
using namespace std;
int main()
{int a[] = {0, 1,12,5,56,3,23,16}; priority_queue<int> temp(a, a + 8);cout << "top element: " << temp.top() << endl;    //56
    cout << "output from top: ";int pd_size = temp.size();for(int i = 0; i < pd_size; i++){cout << temp.top() <<" ";            //56 23 16 12 5 3 1 0
        temp.pop();}return 0;
}

  stack , queue , priority_queue 都是以底部容器完成其所有工作,而这些具有 “修改某物接口,形成另一种风貌” 的性质的数据结构, 成为adapter(配接器), stack , queue , priority_queue 都是容器的配接器。

 

转载于:https://www.cnblogs.com/Forever-Road/p/6897487.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用JMeter对异步HTTP / REST服务进行压力/负载测试

尽管我一直在使用JMeter进行Web应用程序的压力测试和负载测试好几次&#xff0c;但我们还是花了一些时间才弄清楚如何使用该工具测试基于异步HTTP / REST的服务。 在我们这里&#xff0c;我是指一名程序员&#xff0c; Holger Staudacher &#xff0c;我很荣幸能与当前的一个项…

转义字符的使用和功能python_Python中转义符和格式符的混合使用,python,转义字符,与,格式化...

# coding: utf-8 mon 麻辣小龙虾 #周一麻辣小龙虾 tue 宫保鸡丁 #周二宫保鸡丁 wed 水煮肉片 #周三水煮肉片 thu 果儿拌菜 #周四果儿拌菜 fri 小鸡炖蘑菇 #小鸡炖蘑菇 Cf_price 23 #麻辣小龙虾价格 CK_price 12 #宫保鸡丁价格 BM_price 32 #水煮肉片价格 MV_price 19 …

mock接口开发,excel(读,写,修改)

mock接口开发 首先需要安装 Flask 模块 &#xff1a;pip install flask 然后引用 from flask import request #想获取到请求参数的话&#xff0c;就得用这个 lanxia flask.Flask(__name__) #把这个python文件当做一个web服务 lanxia.server(/login,[ post , get ] )#第…

web前端学习之ruby标记和rt/rp标记

ruby 标记定义ruby注释&#xff08;中文注音或字符&#xff09;。ruby标记与rt标记一同使用。ruby标记由一个或多个字符&#xff08;需要一个解释/发音&#xff09;和一个提供该信息的rt 标记组成&#xff0c;还包括可选的rp标记&#xff0c;定义当浏览器不支持ruby 标记时显示…

mysql 5.7 udf http_mysql下mysql-udf-http效率测试小记

看到张宴的博客上关于"http/rest客户端的文章"&#xff0c;怎样安装啥的直接都跳过&#xff0c;下面直接进入测试阶段&#xff0c;测试环境&#xff1a;虚拟机复制代码 代码如下:[rootlocalhost ~]# uname -aLinux sunss 2.6.18-128.el5 #1 SMP Wed Jan 21 10:44:23 …

作为一名程序员,聊聊我们的现状和未来

前言&#xff1a;互联网这个高速发展的新兴行业&#xff0c;注定是敢想敢干敢创新&#xff0c;耐劳耐操耐折腾年轻人的天下&#xff1f; 我们所在的互联网行业&#xff0c;不断地有新的公司冒出&#xff0c;有新的商业模式成形&#xff0c;有新的产品形态影响着大家的生活日常&…

适用于孩子,父母和祖父母的JBoss HornetQ –第1章

现在与HornetQ合作已经快4年了&#xff0c;我认为是时候分享我到目前为止所学知识的一部分了。 这篇文章的主要目的不是重写官方文档 &#xff0c;而是以简单的方式阐明我们在PaddyPower中最常用的概念。 什么是HornetQ HornetQ是JMS实现。 JMS是一种面向消息的中间件API&am…

riot.js教程【四】Mixins、HTML内嵌表达式

前文回顾riot.js教程【三】访问DOM元素、使用jquery、mount输入参数、riotjs标签的生命周期&#xff1b;riot.js教程【二】组件撰写准则、预处理器、标签样式和装配方法&#xff1b;riot.js教程【一】简介&#xff1b; 共享Mixins 混合开发可以使你很好的复用代码&#xff0c;如…

移动端判断手机横竖屏状态

禁用用户自动缩放功能&#xff1a; <meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalable0"> 判断横竖屏状态有两种方法&#xff1a;css判断、js判断 (一)、css判断横屏还是竖屏 1、写在同一个css文…

ubuntu dhcp ping 不通 自己_??2、DHCP安装和配置

DHCP动态主机设置协议&#xff0c;是一个局域网的网络协议&#xff0c;使用UDP协议工作&#xff0c;可以快速分配IP地址&#xff0c;解决内网IP不足、手动配置IP造成IP冲突以及内网机器多手工配置比较麻烦的问题。1.把win2008和win2003设置同一网段&#xff0c;网络适配器—配置…

python秒数变日期_将pandas日期列转换为已用秒数

新答案 将文本转换为Timedeltadf[Origin Time(Local)] pd.to_timedelta(df[Origin Time(Local)]) df[Seconds] df[Origin Time(Local)].dt.total_seconds() 旧答案 考虑数据帧dfdf pd.DataFrame(dict(Datepd.date_range(2017-03-01, 2017-03-02, freq2H))) Date 0 2017-03-0…

mysql用一个表更新另一个表的方法

Solution 1: 修改1列(navicate可行) update student s, city c set s.city_name c.name where s.city_code c.code; Solution 2: 修改多个列 update a, b set a.titleb.title, a.nameb.name where a.idb.id Solution 3: 采用子查询(navicate不可行) update student s set…

选择您的Java EE 6应用服务器

我被问到的第一个问题是&#xff1a;“我们应该使用哪个Java EE应用服务器&#xff1f;”。 随着Java EE 6的日益普及&#xff0c;新的兼容应用程序服务器获得了认证。 当前的官方兼容性和认证矩阵列出了针对完全配置文件&#xff0c;Web配置文件或两者认证的12种不同产品。 如…

串的基本计算

#include<stdio.h> #include<stdlib.h> //typedef int Status; #define Max 20 #define OK 1 #define ERROR 0 #define OVERLOE -2 typedef struct//堆分配表示串 { char *ch; int length; }HString; // int CreatHString(HString &H)//构造字符串 { H.length …

HTML表格属性及简单实例

这里主要总结记录下表格的一些属性和简单的样式&#xff0c;方便以后不时之需。 1、<table> 用来定义HTML的表格&#xff0c;具有本地属性 border 表示边框&#xff0c;border属性的值必须为1或空字符串("")。该属性不会控制边框的样式&#xff0c;而是由CSS来…

怎么查看MySQL 源码编译了什么_Mysql 源码编译教程贴

题外话:这是一篇教程贴,不仅学的是mysql的编译,还是一些编译的知识.我也是一个菜鸟,写一些感悟和心得,有什么问题可以批评指正,谢谢!如果只是为了安装请移到我的另一篇安装贴: Mysql安装贴环境:OS: CentOS 6.6x64 minimysql: mysql-5.6.251. mysql 下载:http://dev.mysql.com/d…

linux mysql启动_MySQL 安装(二)

MySQL 安装所有平台的Mysql下载地址为&#xff1a;MySQL 下载 . 挑选你需要的 MySQL Community Server 版本及对应的平台。Linux/UNIX上安装MySQLLinux平台上推荐使用RPM包来安装MySQL&#xff0c;MySQL AB提供了以下RPM包的下载地址&#xff1a;MySQL - MySQL服务器。你需要该…

0524驼峰命名法,模态对话框

模态对话框 window.showModalDialog("url"&#xff0c;"向目标对话框传的值"&#xff0c;"窗口特征参数") 打开模态对话框 模态对话框必须关掉才能对后端操作。 模块对话框和窗口的区别是永远置顶。 特征参数&#xff1a;用分号隔开&#xff0c;…

谁在偷你的记忆? 应用服务器版

您创建了一个了不起的应用程序。 您将其投入生产。 您会发现您没有足够的可用内存。 即使您的所有测量结果&#xff08;可能是借助我们的小型公用事业公司进行的测量 &#xff09;都表明您应该还不错。 我们计划发布一系列博客文章&#xff0c;研究堆消失的位置&#xff0c;并…

遗忘的html标签

1 <span>x</span><sup>2</sup><span> y10</span> 2 <br> 3 <span>H</span><sub>2</sub><span>O</span> <sup> 标签可定义上标文本。 包含在 <sup> 标签和其结束标签 …