队列——Acwing.829模拟队列

news2024/12/24 20:21:40

队列

定义

队列是一种特殊的线性表,遵循先进先出(First In First Out,FIFO)的原则。可以进行入队(在队尾添加元素)和出队(从队首移除元素)操作。

运用情况

  1. 任务调度:安排任务按照顺序执行。
  2. 排队系统:如银行排队、打印任务排队等。
  3. 广度优先搜索:用于保存待扩展的节点。
  4. 多线程中的任务队列。
  5. 网络通信中的数据包队列。

注意事项

  1. 要注意队列的容量限制,避免溢出。
  2. 操作队列时要确保队首和队尾指针的正确性。
  3. 考虑多线程环境下的同步问题,防止数据竞争。

解题思路

  1. 明确问题是否适合用队列来解决,通常涉及顺序处理、排队等场景。
  2. 创建队列对象并进行初始化。
  3. 按照 FIFO 原则进行入队和出队操作。
  4. 在处理过程中注意边界情况和异常情况。
  5. 根据具体需求,合理利用队列的特性来实现算法逻辑。

例如,在广度优先搜索中,先将起始节点入队,然后不断取出队首节点并扩展,将新节点入队,如此循环直到找到目标或遍历完所有可能。

Acwing.829模拟队列

题目描述

829. 模拟队列 - AcWing题库

运行代码

#include <iostream>  
#include <deque>  
#include <string>  
  
using namespace std;  
  
deque<int> q; // 队列  
  
void push(int x) {  
    q.push_back(x); // 在队尾插入元素  
}  
  
void pop() {  
    if (!q.empty()) {  
        q.pop_front(); // 从队头弹出元素  
    }  
}  
  
void emptyOperation() {  
    if (q.empty()) {  
        cout << "YES" << endl;  
    } else {  
        cout << "NO" << endl;  
    }  
}  
  
void queryOperation() {  
    if (!q.empty()) {  
        cout << q.front() << endl; // 查询队头元素  
    }  
}  
  
int main() {  
    int M;  
    cin >> M;  
      
    while (M--) {  
        string op;  
        cin >> op;  
          
        if (op == "push") {  
            int x;  
            cin >> x;  
            push(x);  
        } else if (op == "pop") {  
            pop();  
        } else if (op == "empty") {  
            emptyOperation();  
        } else if (op == "query") {  
            queryOperation();  
        }  
    }  
      
    return 0;  
}

代码思路

  1. 定义队列:使用C++标准库中的std::deque(双端队列)来存储队列的元素。std::deque提供了在队列两端进行高效插入和删除操作的能力,因此非常适合实现队列。

  2. 定义操作函数

    • push(int x):向队列的尾部插入一个元素x。这是通过调用dequepush_back成员函数实现的。
    • pop():从队列的头部删除一个元素。这是通过调用dequepop_front成员函数实现的。这里假设操作总是合法的,所以没有检查队列是否为空。
    • emptyOperation():检查队列是否为空,并输出相应的结果。如果队列为空,输出"YES",否则输出"NO"。
    • queryOperation():查询队列的头部元素并输出。如果队列不为空,输出头部元素的值。
  3. 主函数处理

    • 读取操作次数M
    • 使用循环处理M个操作。
    • 对于每个操作,首先读取操作类型(字符串)。
    • 根据操作类型调用相应的操作函数。对于push操作,还需要读取要插入的元素值。
  4. 错误处理:在这个实现中,没有显式的错误处理,因为题目描述保证所有操作都是合法的。但在实际应用中,你可能需要添加错误处理来确保输入的有效性。

  5. 输出:根据操作类型,emptyOperationqueryOperation函数会输出相应的结果。

改进思路

  1. 减少不必要的函数调用:在pushpop操作中,由于我们知道std::deque已经提供了高效的push_backpop_front成员函数,我们可以直接在main函数中调用这些成员函数,而不是通过额外的函数来封装它们。

  2. 避免重复代码:在emptyOperationqueryOperation中,我们都在检查队列是否为空。为了避免重复,我们可以将检查队列是否为空的逻辑放在一个单独的函数中。

  3. 输入校验:虽然题目保证输入是合法的,但在实际情况下,我们可能想要添加一些输入校验来确保代码的健壮性。

改进代码

#include <iostream>  
#include <deque>  
#include <string>  
  
using namespace std;  
  
deque<int> q; // 队列  
  
bool isEmpty() {  
    return q.empty();  
}  
  
void processCommands(int M) {  
    for (int i = 0; i < M; ++i) {  
        string op;  
        cin >> op;  
          
        if (op == "push") {  
            int x;  
            cin >> x;  
            q.push_back(x); // 直接在main函数中调用push_back  
        } else if (op == "pop") {  
            if (!isEmpty()) { // 检查队列是否为空  
                q.pop_front(); // 直接在main函数中调用pop_front  
            }  
        } else if (op == "empty") {  
            cout << (isEmpty() ? "YES" : "NO") << endl;  
        } else if (op == "query") {  
            if (!isEmpty()) { // 检查队列是否为空  
                cout << q.front() << endl; // 查询队头元素  
            }  
        }  
    }  
}  
  
int main() {  
    int M;  
    cin >> M;  
      
    processCommands(M);  
      
    return 0;  
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3和ant-design 实现前端多种验证密码规则,最全的前端验证密码规则

1、小眼睛可以显示/隐藏明文密码&#xff08;无法用input typepassword&#xff0c;用css样式实现切换明文&#xff09; 2、输入长度统计&#xff08;不是自带的&#xff0c;用div写的&#xff0c;然后定位到框内的&#xff09; 3、每输入一个字符分别验证每一项规则&#xf…

C++ 34 之 单例模式

#include <iostream> #include <string.h> using namespace std;class King{// 公共的函数&#xff0c;为了让外部可以获取唯一的实例 public:// getInstance 获取单例 约定俗成static King* getInstance(){return true_king;}private: // 私有化// 构造函数设置为…

易趋(EasyTrack)资深咨询顾问刘苗受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 易趋&#xff08;EasyTrack&#xff09;资深咨询顾问刘苗女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“企业级项目管理平台推动 IPD 数字化”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议…

【Nginx系列】分发算法

文章目录 一、分发算法介绍二、nginx集群默认算法三、nginx业务服务器状态四、nginx集群默认算法测试实验环境实验拓扑4.1、轮询算法4.2、基于权重4.3、基于ip_hash分发4.4、基于url的hash &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界…

STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建

STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建 文章目录 STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建功能与作用典型工作流程 1. 硬件原理图介绍2. STM32 CubeMX工程搭建2.1 创建工程2.2 系统配置2.3 USART串口配…

Centos系统yum安装mysql数据库

安装之前需要将系统自带的mariadb-libs软件包删除。 检查是否存在mariadb-libs包。 yum list installed|grep mariadb-libs 删除mariadb-libs包 yum -y remove mariadb-libs 声明&#xff1a; 系统&#xff1a;CentOS-7-x86_64-DVD-2009 安装为最小化安装&#xff0c;没…

跟卖五种常用采集方式,关键词采集升级,更加让新手上手更快!

今天给大家分享一个跟卖选品软件&#xff0c;相信很多卖家都在为选品而苦恼&#xff0c;人工筛选一天也筛选不出几个能用的链接&#xff0c;不仅耗费时间精力&#xff0c;还提升不了选品效率&#xff0c;今天就分享一款实用的选品工具&#xff0c;它能够帮助我们节省选品时间&a…

计算机网络实验(15):基于Socket的网络编程(附JAVA源码.txt)

一、实验名称 UDP客户服务器即时通信程序 二、实验目的&#xff1a; 掌握基于SOCKET的网络编程方法。 基于JAVA语言&#xff0c;编写一个SOCKET的即时通信小程序 三、实验内容和要求 实验内容&#xff1a; 基于JAVA语言&#xff0c;编写一个SOCKET的即时通信小程序 实…

手把手教你构建和使用Redis Cluster去中心化集群

Redis Cluster是Redis官方提供的分布式解决方案。当遇到内存、并发、流量等瓶颈时&#xff0c;就可以采用Cluster架构达到负载均衡目的。官方文档:Scale with Redis Cluster | Docs 1.为什么要用redis-cluster集群&#xff1f; 1.首先Redis单实例主要有单点&#xff0c;容量有…

Spring Cloud Alibaba Nacos作为服务配置中心实践

Nacos官网文档&#xff1a;Nacos 融合 Spring Cloud&#xff0c;成为注册配置中心 【1】服务实例 ① pom依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </de…

使用 Azure AI Document Intelligence 创建智能文档处理

简介 借助 Azure AI 文档智能中的预生成模型&#xff0c;无需自行训练模型&#xff0c;即可从常见表单和文档中提取数据。 公司中&#xff0c;表单种类繁多&#xff0c;如发票、收据、调查表等。你可能想知道&#xff0c;从这些文档中提取姓名、地址、金额等信息需要多少工作…

数字化制造案例分享以及数字化制造能力评估(34页PPT)

资料介绍&#xff1a; 通过全面的数字化企业平台和智能制造技术的应用&#xff0c;制造型企业不仅提升了自身的竞争力&#xff0c;也为整个制造业的数字化转型提供了借鉴。同时&#xff0c;数字化制造能力的评估是企业实现数字化转型的关键环节&#xff0c;需要从技术变革、组…

Linux 并发与竞争基础知识学习

Linux 并发与竞争 并发与竞争 Linux 系统是个多任务操作系统&#xff0c;会存在多个任务同时访问同一片内存区域&#xff0c;这些任务可能会相互覆盖这段内存中的数据&#xff0c;造成内存数据混乱。针对这个问题必须要做处理&#xff0c;严重的话可能会导致系统崩溃。现在的…

Maven:一个下载jar依赖失败的问题解决方案

内部的一个jar包已经上传到了私服上&#xff0c;在私服管理端也能看到该jar包的完整信息&#xff0c;但是springboot项目引入该jar包发现死活下载不下来&#xff0c;报错如图&#xff1a; 从该错误信息中可以看到&#xff0c;找不到服务名是xxl-job这个的&#xff0c;我们要找的…

C语言入门系列:运算符及其优先级

文章目录 一&#xff0c;算术运算符二&#xff0c;自增运算符与自减运算符三&#xff0c;关系运算符四&#xff0c;逻辑运算符逻辑与&#xff08;&&&#xff09;逻辑或&#xff08;||&#xff09;逻辑非&#xff08;!&#xff09;最佳实践&#xff1a;行为单一原则 五&…

最新区块链论文速读--CCF A会议 ICSE 2024 共13篇 附pdf下载 (2/2)

Conference&#xff1a;International Conference on Software Engineering (ICSE) CCF level&#xff1a;CCF A Categories&#xff1a;Software Engineering/System Software/Programming Languages Year&#xff1a;2024 Num&#xff1a;13 第1~7篇区块链文章请点击此处…

【产品经理】订单处理2

本次讲解订单初始化成功到ERP系统过程中的后续环节。 一、根据客服备注更新订单信息 初始化订单过程中&#xff0c;若订单中的客服备注信息对订单进行更新&#xff0c;包括可能改收货信息、改商品、加赠品、指定快递等。 注意&#xff1a;更新订单的过程中要注意订单当前状…

10M速率1553总线终端(RT)模块是依据SAE-AS5652标准设计

10M速率1553总线终端(RT)模块是依据SAE-AS5652标准设计的支持传输速率10Mbps的总线远程终端&#xff08;RT&#xff09;模块&#xff0c;采用SIP封装技术&#xff0c;支持LocalBus接口或UART通信访问&#xff0c;64K*16bits存储空间&#xff0c;灵活的RT数据存储&#xff0c;具…

Android Room数据库使用介绍

1.简介 Room是Google提供的Android架构组件之一&#xff0c;旨在简化数据库操作。它是SQLite的一个抽象层&#xff0c;提供了更易用和安全的API。 Room的总体架构: 2.Room数据库的基础概念 Entity Entity是Room中的数据表&#xff0c;每个Entity类对应一个SQLite表。 DAO …

有什么开放式耳机值得买?六点选购建议你要注意了

作为一名数码爱好者&#xff0c;专业的数码博主&#xff0c;我只想把好的产品介绍给大家&#xff0c;让大家避雷不好用的产品&#xff0c;最近&#xff0c;很多人私信我问我开放式的耳机怎么样&#xff1f;和别的耳机又有什么区别&#xff0c;我发现大家对于开放式耳机的了解少…