STL之queue 【队列】

STL之queue 【队列】

  • 一.基本用法
    • 1.头文件
    • 2.创建queue
    • 3.插入元素:
    • 4.删除元素(弹出元素):
    • 5.访问队列的前端元素
    • 6.访问队列的后端元素
    • 7.检查队列是否为空
    • 8.获取队列的大小
  • 二.综合示例:
      • 用C语言实现队列queue
      • 常见的应用场景包括:

queue:队列,先进先出(FIFO)的数据结构。

一.基本用法

1.头文件

#include <queue>

2.创建queue

你可以创建一个 std::queue 对象,并将其绑定到其他容器(通常是 deque或 list)以提供队列的功能:

std::queue<int> myQueue;  // 创建一个整数类型的队列

3.插入元素:

myQueue.push(42);
myQueue.push(17);

4.删除元素(弹出元素):

myQueue.pop();  // 弹出队列前端元素

5.访问队列的前端元素

使用 front 函数访问队列的前端元素,但不会从队列中移除它:

int frontElement = myQueue.front();  // 访问队列前端元素

6.访问队列的后端元素

使用 back 函数访问队列的后端元素,但不会从队列中移除它:

int backElement = myQueue.back();  // 访问队列后端元素

7.检查队列是否为空

使用 empty 函数检查队列是否为空:

if (myQueue.empty()) {std::cout << "Queue is empty." << std::endl;
} else {std::cout << "Queue is not empty." << std::endl;
}

8.获取队列的大小

使用 size 函数获取队列的大小:

size_t queueSize = myQueue.size();  // 获取队列的大小

二.综合示例:

#include <iostream>
#include <queue>int main() {std::queue<int> myQueue;myQueue.push(42);myQueue.push(17);int frontElement = myQueue.front();std::cout << "Front element: " << frontElement << std::endl;myQueue.pop();int backElement = myQueue.back();std::cout << "Back element: " << backElement << std::endl;if (myQueue.empty()) {std::cout << "Queue is empty." << std::endl;} else {std::cout << "Queue is not empty." << std::endl;}return 0;
}

用C语言实现队列queue

#include <stdio.h>
#include <stdlib.h>// 定义队列节点
typedef struct Node {int data;struct Node* next;
} Node;// 定义队列
typedef struct {Node* front; // 队头指针Node* rear;  // 队尾指针
} Queue;// 初始化队列
void initializeQueue(Queue* queue) {queue->front = NULL;queue->rear = NULL;
}// 判断队列是否为空
int isEmpty(Queue* queue) {return queue->front == NULL;
}// 入队操作
void enqueue(Queue* queue, int value) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = value;newNode->next = NULL;if (isEmpty(queue)) {// 如果队列为空,新节点同时成为队头和队尾queue->front = newNode;queue->rear = newNode;}else {// 否则将新节点链接到队尾,并更新队尾指针queue->rear->next = newNode;queue->rear = newNode;}
}// 出队操作
int dequeue(Queue* queue) {if (isEmpty(queue)) {printf("Queue underflow\n");return -1; // 表示队列为空}// 取出队头节点的数据int value = queue->front->data;// 更新队头指针,如果队列只有一个元素,出队后队列为空Node* temp = queue->front;queue->front = queue->front->next;free(temp);// 如果队列变为空,更新队尾指针if (queue->front == NULL) {queue->rear = NULL;}return value;
}// 打印队列元素
void printQueue(Queue* queue) {if (isEmpty(queue)) {printf("Queue is empty\n");return;}printf("Queue elements: ");Node* current = queue->front;while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}// 释放队列占用的内存
void freeQueue(Queue* queue) {while (!isEmpty(queue)) {dequeue(queue);}
}int main() {Queue myQueue;initializeQueue(&myQueue);enqueue(&myQueue, 10);enqueue(&myQueue, 20);enqueue(&myQueue, 30);printQueue(&myQueue);printf("Dequeued element: %d\n", dequeue(&myQueue));printQueue(&myQueue);freeQueue(&myQueue);return 0;
}

队列

常见的应用场景包括:

  1. 任务调度: 队列可用于任务调度,确保任务按照提交的顺序进行处理。先提交的任务先执行。

  2. 广度优先搜索(BFS): 在图算法中,BFS使用队列来管理待访问的节点,确保按照层级的顺序访问节点。

  3. 打印队列: 在打印系统中,打印任务被排入队列,以便按照先到先服务的原则进行打印。

  4. 缓冲区管理: 队列可以用于管理缓冲区,例如处理网络数据包、操作系统中的缓冲队列等。

  5. 消息传递: 队列常用于实现消息传递系统,其中消息按照发送的顺序进行排队和处理。

  6. 多线程编程: 在多线程应用程序中,队列可以用于线程之间的通信,充当线程安全的消息传递通道。

  7. 实现广告投放系统: 队列可以用于按照广告请求的先后顺序管理广告投放任务。

  8. 计算机网络中的数据传输: 在网络通信中,数据包通常以队列的形式进行传输,确保按照发送的顺序接收。

  9. 作业调度: 在操作系统中,队列可用于作业调度,确保作业按照提交的先后顺序执行。

  10. 排队系统: 在实际生活中的排队系统,如银行、超市等,顾客按照先来先服务的原则排队。

场景示例:BFS

广度优先搜索(Breadth-First Search,BFS)是一种图算法,用于遍历或搜索图数据结构中的所有节点,同时按照层级顺序访问它们。BFS从图中的某一节点开始,首先访问该节点,然后逐层访问其相邻节点,确保先访问离起始节点最近的节点。

BFS的基本思想是使用队列数据结构来辅助实现层级遍历。具体步骤如下:

  1. 将起始节点放入队列中。
  2. 从队列中取出一个节点,并访问该节点。
  3. 将该节点的未访问邻居节点加入队列。
  4. 重复步骤2和步骤3,直到队列为空。

BFS保证了从起始节点开始,逐层遍历到离起始节点最远的节点。这使得BFS在解决一些问题时具有特殊的优势,例如找到最短路径、检测图中的环等。

BFS

#include <stdio.h>
#include <stdbool.h>#define MAX_VERTICES 6//定义图结构
typedef struct {int vertices[MAX_VERTICES][MAX_VERTICES];//存储节点之间连接关系int numVertices;//存储节点数量
} Graph;//初始化图,所有元素默认值0,表示初始状态下没有边相连
void initializeGraph(Graph* graph, int numVertices) {graph->numVertices = numVertices;for (int i = 0; i < numVertices; ++i) {for (int j = 0; j < numVertices; ++j) {graph->vertices[i][j] = 0;}}
}//addEdge 函数用于向图中添加一条边,这里是无向图,设置值为1表示有边
void addEdge(Graph* graph, int start, int end) {graph->vertices[start][end] = 1;graph->vertices[end][start] = 1;
}void bfs(Graph* graph, int startVertex) {int visited[MAX_VERTICES] = { 0 };//用于记录节点是否被访问过int queue[MAX_VERTICES];//用于按照层级顺序存储待访问的节点int front = 0, rear = -1;visited[startVertex] = 1;queue[++rear] = startVertex;while (front <= rear) {int currentVertex = queue[front++];printf("Visited vertex: %d\n", currentVertex);for (int i = 0; i < graph->numVertices; ++i) {if (graph->vertices[currentVertex][i] == 1 && !visited[i]) {visited[i] = 1;queue[++rear] = i;}}}
}int main() {Graph graph;initializeGraph(&graph, MAX_VERTICES);addEdge(&graph, 0, 1);addEdge(&graph, 0, 2);addEdge(&graph, 1, 3);addEdge(&graph, 1, 4);addEdge(&graph, 2, 5);printf("BFS starting from vertex 0:\n");bfs(&graph, 0);return 0;
}

关注我,为大家持续分享更多的内容,让学习变得更简单,与君共勉,共同成长。 也可以关注我的公众号CoderSong,查看更多精彩文章

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

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

相关文章

Redis2-事务 连接Java 整合springboot 注解缓存

一、订阅和发布 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 Redis的发布和订阅 客户端订阅频道发布的消息 频道发布消息 订阅者就可以收到消息 发布订阅的代…

图像噪声、去噪基本方法合集(Python实现)

文章目录 前言 本文主要参考冈萨雷斯的数字图像处理 &#xff08;第4版&#xff09;&#xff0c;介绍图片中一些常见的噪声形式和常用的去噪方法&#xff0c;并且给出相应滤波方法的实现代码。 一、噪声分类 1、高斯噪声2、泊松噪声3、椒盐噪声4、瑞利噪声5、爱尔兰&#xff0…

基于 java+springboot+mybatis电影售票网站管理系统前台+后台设计和实现

基于 javaspringbootmybatis电影售票网站管理系统前台后台设计和实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承…

node12集成form-create遇到的问题

其他版本需要根据node版本以及npm调整 无法安装 taobao镜像出现问题 跟换为最新版本的 // 1. 清空缓存 npm cache clean --force // 2. 关闭SSL验证 npm config set strict-ssl false // 3. 切换新源 npm config set registry https://registry.npmmirror.com // 4. 查看源是…

5 步轻松上手,教你从 0 到 1 落地 Jmeter 接口自动化脚本!

Jmeter是进行接口测试的一款非常主流的工具&#xff0c;但绝大部分测试工程师&#xff0c;对于Jmeter接口测试脚本整理都是一知半解的。今天这篇文章&#xff0c;就以一个金融项目中接口为例&#xff0c;通过简单5步&#xff0c;教大家如何0代码编写Jmeter接口自动化脚本&#…

特征点匹配 harris

算法的核心是利用局部窗口在图像上进行移动&#xff0c;判断灰度是否发生较大的变化。如果窗口内的灰度值&#xff08;在梯度图上&#xff09;都有较大的变化&#xff0c;那么这个窗口所在区域就存在角点。 这样就可以将 Harris 角点检测算法分为以下三步&#xff1a; 当窗口…

Studio One 6 mac 6.5.2 激活版 数字音乐编曲创作

PreSonus Studio One是PreSonus出品的一款功能强大的音乐创作软件。主要为用户提供音乐创作、录音、编辑、制作等功能。它可以让你创造音乐&#xff0c;无限的轨道&#xff0c;无限的MIDI和乐器轨道&#xff0c;虚拟乐器和效果通道&#xff0c;这些都是强大和完美的。 软件下载…

JavaScript DOM对象的尺寸和位置详解

在DOM对象操作中&#xff0c;其尺寸和位置也是DOM的核心内容&#xff0c;因为js的“交互式应用”几乎少不了对DOM对象的尺寸和位置进行操作&#xff0c;特别是js动画效果。 一、关于DOM对象的尺寸和位置介绍 DOM对象的尺寸和位置的属性 DOM对象的属性描述obj.scrollWidth 和…

附1:k8s服务器初始化

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 关联文章&#xff1a; 《RKE快速搭建离线k8s集群并用rancher管理界面》 《附2&#xff1a;rke安装的k8s集群新增主机》 1.创建…

能替代微软AD的国产化方案,搭建自主可控的身份管理体系

随着国产化替代步伐加速&#xff0c;以及企业出于信息安全建设的需要&#xff0c;越来越多的企业和组织开始考虑将现有的微软 Active Directory&#xff08;AD&#xff09;替换为国产化的LDAP身份目录服务&#xff08;也称统一身份认证和管理&#xff09;系统。本文将介绍一种国…

Vue3 Suspense 优雅地处理异步组件加载

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

03.领域驱动设计:了解实体和值对象以及它们的区别

目录 1、概述 2、实体 1.实体的业务形态 2.实体的代码形态 3.实体的运行形态 4.实体的数据库形态 3、值对象 1.值对象的业务形态 2.值对象的代码形态 3.值对象的运行形态 4.值对象的数据库形态 5.值对象的优势和局限 4、实体和值对象的区别 5、总结 1、概述 DDD战…