【C++初阶】12. Stack(栈)和Queue(队列)

这篇具有很好参考价值的文章主要介绍了【C++初阶】12. Stack(栈)和Queue(队列)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 栈和队列的介绍

栈的介绍
队列的介绍
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

2. 栈和队列的使用

最小栈

【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

栈的压入、弹出序列

【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

逆波兰表达式求值

【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

拓展:如何从中缀变为后缀

【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

3. 两种设计模式

设计模式目前分为26种,这里就只介绍两种

  1. 适配器模式
  2. 迭代器模式

在日常生活中,我们常见的适配器通常为电源适配器(充电器) – 电源电压为220v,但是我们的设备并不需要这么高的电压(起保护作用) 需要将电源电压适配到我们所需的电压:50v/36v…
适配器模式:将已有的东西通过封装转换成我们所需的东西
迭代器模式:不暴露底层的实现细节,经过封装后提供统一的方式来访问容器

4. 栈的模拟实现

gitee提交代码:栈的模拟实现
栈遵循"先入后出"的原则,我们是否需要重新实现一个数据结构呢?–能不能采用之前学习的数据结构进行转换呢?
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言
加上缺省值

	template <class T,class Container = vector<T>>

5. 队列的模拟实现

gitee代码提交:队列的实现
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

6. deque的介绍(双端队列)

【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言
双端队列的结构:中控+buffer
在日常的使用场景比较少见,不像vector和list极致
使用场景 :既支持头插头删,又支持尾插尾删 对于随机访问和中间插入比较少
那么就是栈和队列了
所以,deque适合作为栈和队列的适配器
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

7. 优先级队列

7.1 优先级队列的介绍和使用

优先级队列文档介绍
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

数组中的第K个最大元素

思路1:建大堆 + pop K次

【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

思路2:建K个数小堆

【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

7.2 优先级队列的模拟实现

1. 基本框架的搭建

#include <iostream>
#include <vector>
using namespace std;
namespace hx
{
	template<class T,class Container = vector<T>>
	class priority_queue
	{
	public:

		// 建堆
		// 拿迭代器区间初始化
		template<class InputIterator>
		priority_queue(InputIterator first, InputIterator last)
			:_con(first,last)
		{
			// 从最后一个非叶子结点开始向下调整 -- O(N)
			for (int i = (_con, size() - 1 - 1) / 2; i >= 0; i--)
			{
				adjust_down(i);
			}
			// 也可以采用向上调整建堆的方式
			// 但是时间复杂度是O(N*logN) -- 移动的路径更长
		}

		void adjust_down()
		{

		}
		void adjust_up()
		{

		}
		void push(const T& x)
		{
			// vector的尾插
			_con.push_back(x);
			// 将刚刚尾插的元素进行向上调整
			adjust_up(_con.size()-1);
		}
		void pop()
		{
			// 将堆顶的元素和最后一个元素交换
			swap(_con[0], _con[_con.size() - 1]);			
			// 堆顶元素删除
			_con.pop_back();
			// 再将换到堆顶的元素进行向下调整找到新的堆顶元素
			adjust_down(0);
		}
		const T& top() const
		{
			return _con[0];
		}
		bool empty() const
		{
			return _con.empty();
		}
		size_t size()const
		{
			return _con.size();
		}
	private:
		Container _con;
	};
}

2. 向上/下调整算法

不管是向上还是向下调整算法都面临建大堆还是建小堆的问题(都可以 – 无非就是改个判断条件)
假设我们构建的是大堆
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

		// 孩子结点 -- 往上调整
		void adjust_up(size_t child)
		{
			size_t parent = (child - 1) / 2;
			// 循环结束条件 拿child判断 当child = 0时循环结束 -- child到堆顶
			// 因为是size_t 所以不能用>=来判断(不然就是死循环)
			while (child > 0)
			{
				//大堆 -- 父 > 子
				if (_con[parent] < _con[child])
				{
					swap(_con[parent], _con[child]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}

3. 验证实现成功

【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

8. 仿函数/函数对象

1. 实现仿函数

【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

2. 仿函数的用处

从实现完成的代码来看感觉仿函数没啥作用,要实现一个operator()干啥,咱们举例说明

例一:冒泡排序控制升降序

【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

例二:优先级队列

优先级队列中也存在建大堆小堆(升降序)的问题
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

例三:Date类型

解决奇葩报错:只能说使用模板时,还是要小心注意
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言
那么对于 Date* 类型呢?
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

9. 反向迭代器

其实反向迭代器也是一种设计模式,在STL源码当中是通过使用正向迭代器来构造的反向迭代器

9.1 反向迭代器的模拟实现

【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言

9.2 反向迭代器的应用场景

【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言
【C++初阶】12. Stack(栈)和Queue(队列),C++初阶,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-519590.html

到了这里,关于【C++初阶】12. Stack(栈)和Queue(队列)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】栈和队列(stack and queue)语法使用及实现原理

         本篇文章会对C++中的容器stack和queue用法进行详解,也包含对优先队列(priority_queue)的讲解。同时会模拟实现stack、queue和priority_queue底层。希望本篇文章会对你有所帮助! 目录 一、stack 栈 1、1 什么是适配器 1、2 stack 语法讲解 1、3 stack 底层实现 1、4 deque 双端队列简单

    2024年02月15日
    浏览(43)
  • C++ 栈和队列(stack and queue)语法使用及底层实现原理

         本篇文章会对C++中的容器stack和queue用法进行详解,也包含对优先队列(priority_queue)的讲解。同时会模拟实现stack、queue和priority_queue底层。希望本篇文章会对你有所帮助! 目录 一、stack 栈 1、1 什么是适配器 1、2 stack 语法讲解 1、3 stack 底层实现 1、4 deque 双端队列简单

    2024年02月13日
    浏览(39)
  • 【C++初阶】模拟实现优先级队列priority_queue

    👦个人主页:@Weraphael ✍🏻作者简介:目前学习C++和算法 ✈️专栏:C++航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨ 优先级队列顾名思义就是 按优先级出队列 priority_queue 是一个容器适配器,默认使用

    2024年02月10日
    浏览(40)
  • 【数据结构】栈和队列超详解!(Stack && Queue)

    栈 :一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则 压栈 : 栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈 : 栈的删除操

    2024年02月04日
    浏览(43)
  • 数据结构入门到入土——栈(Stack)和队列(Queue)

    目录 一,栈(Stack) 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1.5 栈,虚拟机栈,栈帧有什么区别? 二,队列(Queue) 2.1 概念 2.2 队列的使用  2.3 队列模拟实现 2.4 循环队列 三,双端队列 栈 :一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操

    2024年02月02日
    浏览(54)
  • Java 【数据结构】 栈(Stack)和队列(Queue)【神装】

      登神长阶  第三神装 S tack    第四神装 Queue    目录 🔋一.栈 Stack 💻1.概念 🖥️2.基本操作  🖨️3.相关OJ题   🖱️4.栈、虚拟机栈和栈帧的区别 🪫二.队列 Queue 🖲️1.概念 💽2.基本操作 🔌三.总结与反思         在 Java 中,栈(Stack)是一种后进先出(LIFO)的数

    2024年04月27日
    浏览(36)
  • C++——Stack&&Queue

    目录 一Stack 1介绍 2接口  3模拟实现 4栈的oj题  二Queue 1介绍 2接口 3模拟实现 三容器适配器 1再谈栈和队列  四优先级队列 1接口 ​编辑 2仿函数 五dequeue的简单介绍  先来看看库中对栈的介绍: 1. stack是一种容器适配器,专门用在具有 后进先出 操作的上下文环境中,其删除

    2024年04月13日
    浏览(78)
  • 【C++】stack & queue

    适配器 是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成我们希望的另外一个接口。 虽然 stack 和 queue 中也可以存放元素,但在 STL 中并没有将其划分在容器的行列,而是将其称为 容器

    2024年02月07日
    浏览(38)
  • 【C++ 】stack 和 queue

    stack 的介绍: 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作 2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定

    2024年04月15日
    浏览(29)
  • C++ STL stack & queue

    目录 一.stack 介绍  二.stack 使用 三.stack 模拟实现 普通版本: 适配器版本: 四.queue的介绍 五. queue使用 六.queue模拟实现 七.deque介绍 1.容器适配器 2.deque的简单介绍 3.deque的缺陷 4.为什么选择deque作为stack和queue的底层默认容器 stack------reference 1. stack是一种容器适配器,专门用在

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包