简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🍉🍉🍉文章目录🍉🍉🍉
- 🌻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;
}