C++中队列的建立与操作详细解析

yizhihongxing

C++中队列的建立与操作详细解析

队列(Queue)是一种常用的数据结构,它遵循先进先出(FIFO)的原则。在C++中,我们可以使用标准库中的queue头文件来实现队列的建立与操作。

队列的建立

要使用队列,首先需要包含queue头文件:

#include <queue>

然后,我们可以使用std::queue模板类来创建一个队列对象。例如,我们可以创建一个存储整数的队列:

std::queue<int> myQueue;

队列的操作

入队操作

要将元素添加到队列中,我们可以使用push函数。例如,将整数1和2添加到队列中:

myQueue.push(1);
myQueue.push(2);

出队操作

要从队列中取出元素,我们可以使用pop函数。它会将队列中的第一个元素移除,并返回它的值。例如,从队列中取出并打印第一个元素:

int frontElement = myQueue.front();
myQueue.pop();
std::cout << \"Front element: \" << frontElement << std::endl;

队列是否为空

我们可以使用empty函数来检查队列是否为空。它会返回一个布尔值,表示队列是否为空。例如,检查队列是否为空并打印结果:

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

队列的大小

我们可以使用size函数来获取队列中元素的个数。它会返回一个整数,表示队列的大小。例如,获取队列的大小并打印结果:

int queueSize = myQueue.size();
std::cout << \"Queue size: \" << queueSize << std::endl;

示例说明

示例1:使用队列实现广度优先搜索(BFS)

#include <iostream>
#include <queue>
#include <vector>

void bfs(std::vector<std::vector<int>>& graph, int startNode) {
    std::queue<int> myQueue;
    std::vector<bool> visited(graph.size(), false);

    myQueue.push(startNode);
    visited[startNode] = true;

    while (!myQueue.empty()) {
        int currentNode = myQueue.front();
        myQueue.pop();
        std::cout << currentNode << \" \";

        for (int neighbor : graph[currentNode]) {
            if (!visited[neighbor]) {
                myQueue.push(neighbor);
                visited[neighbor] = true;
            }
        }
    }
}

int main() {
    std::vector<std::vector<int>> graph = {{1, 2}, {0, 2, 3}, {0, 1, 3}, {1, 2}};
    bfs(graph, 0);
    return 0;
}

在这个示例中,我们使用队列实现了广度优先搜索算法。我们首先将起始节点加入队列,并标记为已访问。然后,我们循环遍历队列,取出队列中的节点,并打印它。接着,我们将该节点的未访问邻居节点加入队列,并标记为已访问。这样,我们就可以按照广度优先的顺序遍历整个图。

示例2:使用队列实现生产者-消费者模型

#include <iostream>
#include <queue>
#include <thread>

std::queue<int> myQueue;
std::mutex mtx;
std::condition_variable cv;

void producer() {
    for (int i = 0; i < 10; i++) {
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
        std::unique_lock<std::mutex> lock(mtx);
        myQueue.push(i);
        std::cout << \"Produced: \" << i << std::endl;
        lock.unlock();
        cv.notify_all();
    }
}

void consumer() {
    while (true) {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, []{ return !myQueue.empty(); });
        int item = myQueue.front();
        myQueue.pop();
        std::cout << \"Consumed: \" << item << std::endl;
        lock.unlock();
    }
}

int main() {
    std::thread producerThread(producer);
    std::thread consumerThread(consumer);

    producerThread.join();
    consumerThread.join();

    return 0;
}

在这个示例中,我们使用队列实现了生产者-消费者模型。生产者线程不断地向队列中添加元素,而消费者线程则不断地从队列中取出元素。我们使用互斥锁(std::mutex)来保护队列的访问,并使用条件变量(std::condition_variable)来实现线程间的同步。生产者在添加元素后通知消费者,消费者在队列非空时等待通知并取出元素。

以上就是C++中队列的建立与操作的详细解析,希望对你有帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中队列的建立与操作详细解析 - Python技术站

(0)
上一篇 2023年8月2日
下一篇 2023年8月2日

相关文章

  • SpringBoot项目速度提升之延迟初始化(Lazy Initialization)详解

    SpringBoot项目速度提升之延迟初始化(Lazy Initialization)详解 什么是延迟初始化? 在 SpringBoot 项目中,如果需要频繁地实例化大量的 Bean,就会导致系统启动速度变慢,影响用户体验。此时,可以使用延迟初始化的方式,在需要使用 Bean 时再去实例化,从而提高系统的启动速度。 如何使用延迟初始化? 延迟初始化可以通过在…

    other 2023年6月20日
    00
  • 怎么更改富士施乐打印机用户名和密码?

    下面是更改富士施乐打印机用户名和密码的完整攻略: 1. 进入富士施乐打印机设置界面 首先,需要通过浏览器进入富士施乐打印机的管理界面。具体步骤如下: 找到富士施乐打印机的IP地址。可以在打印机本身或者打印机手册上找到IP地址。 在电脑上打开浏览器,输入富士施乐打印机的IP地址,并按下回车。 输入用户名和密码。默认情况下,富士施乐打印机的用户名是“admin”…

    other 2023年6月27日
    00
  • vue3中的hook简单封装

    下面是关于“vue3中的hook简单封装”的完整攻略: 一、Vue3中的Hook 在Vue3中,我们可以使用三种类型的Hook: Setup Hook:这是Vue3中的重要新增特性,我们可以在这个函数中进行组件的初始化,并且可以访问到组件的props、data、methods等属性和方法。 Lifecycle Hook:这些Hook会在组件的生命周期内自动被…

    other 2023年6月25日
    00
  • mysql字段为NULL索引是否会失效实例详解

    MySQL字段为NULL索引是否会失效实例详解 在MySQL中,字段为NULL的索引是否会失效是一个常见的问题。下面将详细讲解这个问题,并提供两个示例说明。 1. NULL值索引失效问题 当一个字段的索引中包含NULL值时,MySQL的查询优化器可能会选择不使用该索引,导致索引失效。这是因为在B树索引中,NULL值是不可比较的,所以无法进行有效的索引查找。 …

    other 2023年10月18日
    00
  • Java采用循环链表结构求解约瑟夫问题

    Java采用循环链表结构求解约瑟夫问题 什么是约瑟夫问题 约瑟夫问题(Josephus problem)是一个著名的趣题,其描述如下:$n$ 个人围成一圈,从第 $1$ 个人开始报数,报到第 $m$ 个人出圈,然后从出圈的下一个人开始重新报数,重复这个过程,直到圈中只剩下最后一个人,求出这个人的编号。 解决方式 约瑟夫问题的求解方式很多,这里介绍一种使用循环…

    other 2023年6月27日
    00
  • Linux dirname命令的具体使用

    Linux dirname命令的具体使用攻略 Linux dirname命令用来返回指定路径参数中的目录部分。具体来说,dirname会忽略指定路径参数的最后一个路径名并返回其上一级目录的路径(如果路径名参数只包含一个路径名则返回当前目录的路径名)。 命令格式 dirname [OPTION] PATH 参数说明 PATH:要处理的路径名。如果PATH参数不…

    other 2023年6月27日
    00
  • 苹果watchOS7 Beta 2 推送 watchOS7 开发者预览 Beta 2更新内容一览

    苹果watchOS7 Beta 2 推送 watchOS7 开发者预览 Beta 2更新内容一览 简介 苹果watchOS7 Beta 2已经推送,开发者可以通过 https://developer.apple.com/download/ 上直接下载安装。 本文将详细讲解watchOS7 Beta 2的更新内容。 更新内容 以下是watchOS7 Beta …

    other 2023年6月26日
    00
  • 侠客风云传妹子男主结局是什么 侠客风云传全结局图文介绍

    侠客风云传妹子男主结局攻略 《侠客风云传》是一款受欢迎的角色扮演游戏,玩家在游戏中扮演男主角,与各种妹子展开互动,并最终决定与哪位妹子结局。以下是关于妹子男主结局的详细攻略。 1. 收集好感度 在游戏中,与每个妹子互动可以提高她们对男主角的好感度。好感度是影响结局的重要因素,因此玩家需要与妹子进行对话、完成任务、赠送礼物等方式来提高好感度。每个妹子都有不同的…

    other 2023年7月28日
    00
合作推广
合作推广
分享本页
返回顶部