C++之容器:双端队列queue用法实例(二百七十二)

2024-05-15 11:28

本文主要是介绍C++之容器:双端队列queue用法实例(二百七十二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2.C++之queue介绍
    • 🌻3.代码实例
      • 🐓3.1 使用 queue 实现 Level Order 遍历二叉树
      • 🐓3.2 使用 queue 解决广度优先搜索问题
      • 🐓3.3 使用 queue 实现逆波兰表达式求值

🌻1.前言

本篇目的:C++之容器:双端队列queue用法实例

🌻2.C++之queue介绍

  • C++ 中的 deque 是一种容器,全称为 double-ended queue,即双端队列。它支持在两端进行元素的插入和删除操作,具有较高的效率。deque 是 C++ STL(标准模板库)中的一部分,使用时需要包含头文件 。

  • deque 的主要特点如下:

  • 两端操作:deque 支持在两端进行元素的插入和删除。这意味着可以在队列的前端(头部)和后端(尾部)分别进行 push 和 pop 操作,类似于生活中的队列和栈。

  • 动态数组:deque 内部采用动态数组实现,可以自动调整容量以适应元素数量的变化。当 deque 容量不足时,系统会自动为其分配更大的空间;当容量过剩时,系统会释放部分空间。

  • 随机访问:deque 支持随机访问,即可以通过索引直接访问 deque 中的元素。这使得 deque 在查找元素时具有较高的效率。

  • 迭代器:deque 支持迭代器,可以通过迭代器进行元素的遍历和操作。

  • 在使用 deque 时,需要指定其元素类型。例如,创建一个整数类型的 deque,可以使用以下语法:

deque 的常用操作:
插入元素:
在前端插入元素:d.push_front(value)
在后端插入元素:d.push_back(value)
删除元素:
从前端删除元素:d.pop_front()
从后端删除元素:d.pop_back()
访问元素:
通过索引访问元素:d[index]
获取前端元素:d.front()
获取后端元素:d.back()
容量操作:
返回 deque 的容量:d.size()
清空 deque:d.clear()
返回 deque 的最大容量:d.max_size()
关系操作:
判断两个 deque 是否相等:d1 == d2
判断两个 deque 是否不等:d1 != d2
判断 deque 是否为空:d.empty()

🌻3.代码实例

🐓3.1 使用 queue 实现 Level Order 遍历二叉树

#include <iostream>
#include <queue>
#include <vector>struct TreeNode {int value;TreeNode *left;TreeNode *right;TreeNode(int x) : value(x), left(nullptr), right(nullptr) {}
};void levelOrder(TreeNode *root) {if (root == nullptr) return;std::queue<TreeNode*> q;q.push(root);while (!q.empty()) {TreeNode *node = q.front();q.pop();std::cout << node->value << " ";if (node->left != nullptr) q.push(node->left);if (node->right != nullptr) q.push(node->right);}
}int main() {TreeNode *root = new TreeNode(1);root->left = new TreeNode(2);root->right = new TreeNode(3);root->left->left = new TreeNode(4);root->left->right = new TreeNode(5);std::cout << "Level Order 遍历结果: ";levelOrder(root);return 0;
}

🐓3.2 使用 queue 解决广度优先搜索问题

#include <iostream>
#include <queue>
#include <vector>void BFS(int start, const std::vector<int>& graph) {std::queue<int> q;std::vector<bool> visited(graph.size(), false);q.push(start);visited[start] = true;while (!q.empty()) {int node = q.front();q.pop();std::cout << node << " ";for (int neighbor : graph[node]) {if (!visited[neighbor]) {q.push(neighbor);visited[neighbor] = true;}}}
}int main() {std::vector<int> graph[] = {{1, 2}, {3}, {3}, {}};BFS(0, graph);return 0;
}

🐓3.3 使用 queue 实现逆波兰表达式求值

#include <iostream>
#include <queue>
#include <stack>
#include <cmath>
#include <cstring>using namespace std;int precedence(char op) {if (op == '+' || op == '-') return 1;if (op == '*' || op == '/') return 2;return 0;
}int applyOp(int a, int b, char op) {switch (op) {case '+': return a + b;case '-': return a - b;case '*': return a * b;case '/': return a / b;}return 0;
}int evaluateRPN(string &rpn) {stack<int> values;std::queue<char> ops;for (int i = 0; i < rpn.length(); i++) {if (rpn[i] == ' ') continue;if (isdigit(rpn[i])) {values.push(stoi(string(1, rpn[i])));} else {ops.push(rpn[i]);}}while (!ops.empty()) {char op = ops.front();ops.pop();int b = values.top();values.pop();int a = values.top();values.pop();values.push(applyOp(a, b, op));}}return values.top();
}int main() {string rpn = "2 3 4 * + 5 6 / +";cout << "逆波兰表达式求值结果: " << evaluateRPN(rpn) << endl;return 0;
}

这篇关于C++之容器:双端队列queue用法实例(二百七十二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/991699

相关文章

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window