C++stack_queue

news2024/10/3 4:34:46

stack_queue

  • 容器适配器
  • stack详解
    • 栈适配器
    • 栈模拟实现
  • 队列详解
    • 队列适配器
    • queue模拟实现

容器适配器

除了顺序容器外,标准库还定义了三个顺序容器适配器:stack(栈),queue(队列),priority_queue(优先队列)。适配器是标准库中的一个通用概念。容器,迭代器和函数都有适配器。本质上一个适配器是一种机制,能使某种事物的行为看起来像另外一种事情一样。一个适配器接受一种已有的容器类型。使其行为看起来像一种不同的类型。

默认情况下,stack和queue是基于deque(双端队列)实现的,priority_queue是再vector之上实现的。

template <class T, class Container = deque<T> > class stack;
template <class T, class Container = deque<T> > class queue;
template <class T, class Container = vector<T>,
  class Compare = less<typename Container::value_type> > class priority_queue;

我们可以再创建一个适配器时将一个命名的顺序容器作为第二个类型参数,来重载默认的容器类型。

stack<int,vector<int>> stk;
stack<int,list<int>> stk;
queue<int,vector<int>> q;

对一个给定的适配器,可以使用哪些容器是有限制的。所有适配器都要求容器具有添加和删除元素的能力。因此,适配器不能构造再array之上。

stack只要求push_back,pop_back,back操作,可以使用除array和forward_list之外的任何容器类型来构造stack。

queue适配器要求back,push_back,front,push_front,因此它的构造可以构造于list,deque之上,但是不能用vector,因为vector没有push_front等函数,但自己模拟实现的时候,强行用vector也是可以实现的。

priority_queue除了front,push_back,pop_back操作之外,还要求随机访问能力,因此它可以再vector和deque的基础上构造,但不能用list,list不支持随机访问。

stack详解

栈适配器

stack类型定义再stack头文件中,栈所支持的操作不算太多,再之前的数据结构中模拟实现栈的时候,大部分函数已经实现。

在这里插入图片描述

	std::stack<int> stk;//空栈
	stk.push(1);//压栈
	stk.push(2);
	stk.push(3);
	stk.push(4);

	while (!stk.empty()/*判断栈是否为空*/)
	{
		std::cout << stk.top() << ' ';//输出栈顶元素
		stk.pop();//出栈
	}

每个容器适配器都基于底层容器类型的操作定义了自己的特殊操作,我们只可以使用适配器操作,而不能使用底层容器类型的操作。

栈模拟实现

namespace HaiFan
{
	template <class T, class Container = deque<T> > 
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		T top()
		{
			return _con.back();
		}

		bool empty()
		{
			return _con.empty();
		}

		void pop()
		{
			_con.pop_back();
		}

		size_t size()
		{
			return _con.size();
		}

		void swap(stack<T>& it)
		{
			_con.swap(it._con);
		}
		//swap函数交换的是容器对象,而不是it本身,所以再模拟实现按的时候要注意一下,否则会出现类型不匹配的报错。
	private:
		Container _con;
	};
}

队列详解

队列适配器

queue和priority_queue适配器定义再queue头文件中。

queue

在这里插入图片描述

priority_queue

在这里插入图片描述

标准库queue使用一种先进先出的存储和访问策略。进入队列的对象被放置到队尾,而离开队列的对象则从队首删除。

priority_queue允许我们为队列中的元素建立优先级。新加入的元素会排在所有优先级比他低的已有元素之前。

queue的用法很简单,empty判空,size队列大小,front队首元素,back队尾元素,push入队,pop出队。


优先队列其实是一个堆

	priority_queue<int, vector<int>, greater<int>> q;
	//greater小根堆,less大根堆
	q.push(1);
	q.push(-1);
	q.push(100);
	q.push(120);
	q.push(10);
	
	while (q.size())
	{
		cout << q.top() << ' ';
		q.pop();
	}

在这里插入图片描述

queue模拟实现

#pragma once

#include <deque>

namespace HaiFan
{
	template<class T,class Container = deque<T>>
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_front();
		}

		T front()
		{
			return _con.front();
		}

		T back()
		{
			return _con.back();
		}

		size_t size()
		{
			return _con.size();
		}

		bool empty()
		{
			return _con.empty();
		}

	private:
		Container _con;
	};
}

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

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

相关文章

Android Jetpack

Jetpack 是一个由多个库组成的套件&#xff0c;可帮助开发者遵循最佳实践、减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码&#xff0c;让开发者可将精力集中于真正重要的编码工作。 1.基础组件 &#xff08;1&#xff09;AppCompat&#xff1a;使得支持较低…

了解政策法规和行业规范,可以帮助写作人员更好地理解公文要求和标准

了解政策法规和行业规范&#xff0c;可以帮助写作人员更好地理解公文要求和标准。 政策法规和行业规范是公文写作的重要参考依据&#xff0c;包括相关法律法规、行业标准和制度规定等。了解这些规范和标准可以帮助写作人员更好地掌握公文的表达要求和规范要求&#xff0c;以确保…

跨境选品怎么选?建议独立站卖家收下这份利基产品查找攻略!

跨境电商平台现在可谓是火热发展中&#xff0c;独立站出海风口&#xff0c;其实选择的机会还真不少&#xff0c;相比国内电商的发展势头&#xff0c;看得出来&#xff0c;未来跨境电商的大门&#xff0c;对你而言&#xff0c;敞开着。选品这事儿&#xff0c;就像你上战场前挑选…

linux_驱动_iic总线获取si7006温湿度

应用层si7006.c #include<stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/ioctl.h> #include <arpa/inet.h>…

学生信息管理系统springboot学校学籍专业数据java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 学生信息管理系统springboot 系统3权限&#xff1a;超…

C语言 函数指针详解

一、函数指针 1.1、概念 函数指针&#xff1a;首先它是一个指针&#xff0c;一个指向函数的指针&#xff0c;在内存空间中存放的是函数的地址&#xff1b; 示例&#xff1a; int Add(int x&#xff0c;int y) {return xy;} int main() {printf("%p\n",&Add);…

Linux tcpdump 命令详解

简介 用简单的话来定义tcpdump&#xff0c;就是&#xff1a;dump the traffic on a network&#xff0c;根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的…

MPLS(下)

LDP --- 标签分发协议 --- 主要应用在MPLS的控制层面 MPLS控制层面需要完成的工作主要就是分配标签和传递标签。分配标签的前提是本地路由表中得先存在标签&#xff0c;传递标签的前提也是得先具备路由基础。所以&#xff0c;LDP想要正常工作&#xff0c;则需要IGP作为基础。 …

Docker实战-操作Docker容器实战(一)

导语   在之前的分享中&#xff0c;我们介绍了关于如何去操作Docker镜像&#xff0c;下面我们来看看如何去操作容器。 简单来讲&#xff0c;容器是镜像运行的一个实例&#xff0c;与镜像不同的是镜像只能作为一个静态文件进行读取&#xff0c;而容器是可以在运行时进行写入操…

嵌入式的日常工作内容是什么?

1、看器件文档 2、找供应商要资料 3、打电话或微信联系供应商了解技术或器件细节 4、忍受门外汉领导连环夺命吹&#xff0c;因为他们不懂技术&#xff0c;只会问进度 5、写技术文档 6、跟硬件工程师联合测试&#xff0c;查看电路板未工作状态各种问题。有时还要自己手动DI…

tomcat通用回显

​Tomcat架构简析 tomcat的架构图 Server:整个tomcat启动的时候只有一个server Service:一个server中包含了多个service,表示服务 **Container:**容器,可以看作是一个servlet容器,包含一些Engine,Host,Context,Wraper等,访问的路径什么的就存放在这里 Engine -- 引擎 Host …

搞个个人博客,纯学习想找个纯html模板咋就这难

以前做毕业设计的时候老想找一些不掺杂后端代码的前端模板。 可是下载下来&#xff0c;不是php就是python后台的。看又看不懂&#xff0c;想换语言就必须先把里面的后台代码拿掉。 就很像买了个精装的二手房&#xff0c;白白多花了砸墙钱。 就比如&#xff0c;想做个带菜单的…

编写SPI_Master驱动程序_新方法

编写SPI_Master驱动程序_新方法 文章目录 编写SPI_Master驱动程序_新方法一. SPI驱动框架1.1 总体框架1.2 怎么编写SPI_Master驱动1.2.1 编写设备树1.2.2 编写驱动程序 二、 编写程序2.1 数据传输流程2.2 写代码 致谢 参考资料&#xff1a; 内核头文件&#xff1a;include\lin…

vsphere6.5 创建数据中心、集群和添加主机

1、新建数据中心&#xff0c;在入门页面选择创建数据中心&#xff0c;名称可以自定义。 2、创建完成数据中心后就可以添加主机和创建集群了。 3、新建一个集群&#xff0c;并打开DRS和HA功能&#xff0c;这两个功能的一些其他选项可以在创建完成后进一步设置&#xff0c;关于EV…

我能“C“——扫雷游戏

一.前言&#xff1a; 扫雷游戏&#xff0c;一款经典的游戏&#xff0c;没玩过的话也可以试着玩一玩&#xff0c;这样对写扫雷游戏这个小游戏的化是会有一个很好的思路的。那么本片博客就来介绍如何实现扫雷游戏的具体步骤。扫雷游戏链接&#x1f449; 扫雷游戏网页版 - Minesw…

人工智能在推动生产力上的分析

像ChatGPT这样的大型语言模型正在成为强大的工具&#xff0c;不仅可以提高工人的生产力&#xff0c;还可以提高创新率&#xff0c;为经济增长的显著加速奠定基础。作为一项通用技术&#xff0c;人工智能将影响广泛的行业&#xff0c;促进对新技能的投资&#xff0c;改变业务流程…

DWG图纸在SOLIDWORKS软件里如何使用?

经常有工程师咨询DWG图纸在SOLIDWORKS软件里如何使用&#xff0c;其实这涉及到DWG图纸在SOLIDWORKS软件里的重用问题&#xff0c;SOLIDWORKS支持对DWG图纸的重用&#xff0c;常用的有三种方法&#xff1a; 1.作为原始DWG图纸查看作为原始DWG图纸查看是指使用SOLIDWORKS软件直接…

Nginx使用proxy_cache指令设置反向代理缓存静态资源

场景 CentOS7中解压tar包的方式安装Nginx&#xff1a; CentOS7中解压tar包的方式安装Nginx_centos7 tar文件 怎么load_霸道流氓气质的博客-CSDN博客 参考上面流程实现搭建Nginx的基础上&#xff0c;实现静态资源的缓存设置。 注意上面安装时的目录是在/opt/nginx目录下&…

Python编程从入门到实践练习第四章:对列表进行操作

本文目录 一、 创建数值列表1.1 使用range创建数字列表涉及方法使用实例输出 1.2 列表解析1.3 练习题代码输出 二、对列表部分元素进行操作2.1 切片使用实例 2.2 复制列表2.3 练习题代码输出 三、元组3.1 元组介绍3.2 练习题代码输出 一、 创建数值列表 1.1 使用range创建数字…

理解Android生命周期

写一个demo&#xff0c;实现两个页面之间的跳转。重写7个生命周期方法&#xff0c;在方法中打印日志&#xff0c;观察状态的变化。 MainActivity 设置一个常量。 private static final String TAG "hello_activity_1";重写7个生命周期。 在生命周期方法中&#…