队列——Acwing.829模拟队列

队列

定义

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

运用情况

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

注意事项

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

解题思路

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

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

Acwing.829模拟队列

题目描述

829. 模拟队列 - AcWing题库

运行代码

cpp 复制代码
#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. 输入校验:虽然题目保证输入是合法的,但在实际情况下,我们可能想要添加一些输入校验来确保代码的健壮性。

改进代码

cpp 复制代码
#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;  
}
相关推荐
springfe01019 分钟前
构建大顶堆
前端·算法
凌辰揽月1 小时前
Web后端基础(基础知识)
java·开发语言·前端·数据库·学习·算法
lifallen1 小时前
深入浅出 Arrays.sort(DualPivotQuicksort):如何结合快排、归并、堆排序和插入排序
java·开发语言·数据结构·算法·排序算法
jingfeng5141 小时前
数据结构排序
数据结构·算法·排序算法
能工智人小辰1 小时前
Codeforces Round 509 (Div. 2) C. Coffee Break
c语言·c++·算法
kingmax542120081 小时前
CCF GESP202503 Grade4-B4263 [GESP202503 四级] 荒地开垦
数据结构·算法
岁忧1 小时前
LeetCode 高频 SQL 50 题(基础版)之 【高级字符串函数 / 正则表达式 / 子句】· 上
sql·算法·leetcode
eachin_z2 小时前
力扣刷题(第四十九天)
算法·leetcode·职场和发展
闻缺陷则喜何志丹2 小时前
【强连通分量 缩点 拓扑排序】P3387 【模板】缩点|普及+
c++·算法·拓扑排序·洛谷·强连通分量·缩点
机器学习之心3 小时前
机器学习用于算法交易(Matlab实现)
算法·机器学习·matlab