You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多队列三操作实现问题:C++代码错误排查与修正

修正单队列模拟多队列的实现错误

问题背景

需要模拟n个遵循FIFO规则的队列Q_i(i=0,1,...,n-1),支持三类操作:

  • 操作0:向队列Q_t插入整数x
  • 操作1:输出Q_t的队首元素(队列空则不操作)
  • 操作2:删除Q_t的队首元素(队列空则不操作)

原实现用单个queue存储<t,x>对,但运行测试用例时,预期输出1、4、2,实际得到1、2、3;添加break后输出1、4,但无法处理最后一个1 0操作,核心问题是查询/删除指定队列元素时,未正确遍历队列找到目标元素,也未维护全局队列的元素顺序。

错误原因

原实现的逻辑缺陷:

  1. 查询或删除指定队列的队首时,仅检查队列头部的少数元素,未完整遍历队列找到第一个属于目标队列的元素
  2. 处理非目标队列元素时,未正确维护全局队列的元素相对顺序,导致后续操作的元素位置混乱

修正方案

通过临时队列辅助遍历,确保:

  • 查询操作:遍历全局队列找到第一个目标队列的元素,输出后将所有元素按原顺序放回全局队列
  • 删除操作:遍历全局队列,跳过第一个目标队列的元素,将其余元素按原顺序放回全局队列
  • 插入操作:直接将<t,x>对入队,逻辑无需修改

完整修正代码

#include <iostream>
#include <queue>
#include <utility>
using namespace std;

// 全局队列,存储<队列编号t, 元素值x>对
queue<pair<int, int>> global_queue;

// 操作0:向Q_t插入x
void insert(int t, int x) {
    global_queue.push(make_pair(t, x));
}

// 操作1:查询并输出Q_t的队首元素
void query(int t) {
    queue<pair<int, int>> temp_queue;
    bool found = false;

    // 遍历全局队列,寻找目标元素
    while (!global_queue.empty()) {
        auto curr = global_queue.front();
        global_queue.pop();
        temp_queue.push(curr);

        // 找到第一个属于Q_t的元素,输出
        if (!found && curr.first == t) {
            cout << curr.second << endl;
            found = true;
        }
    }

    // 将所有元素放回全局队列,保持原顺序
    while (!temp_queue.empty()) {
        global_queue.push(temp_queue.front());
        temp_queue.pop();
    }
}

// 操作2:删除Q_t的队首元素
void delete_front(int t) {
    queue<pair<int, int>> temp_queue;
    bool deleted = false;

    // 遍历全局队列,跳过第一个目标元素
    while (!global_queue.empty()) {
        auto curr = global_queue.front();
        global_queue.pop();

        if (!deleted && curr.first == t) {
            deleted = true;
            continue; // 跳过该元素,实现删除
        }

        temp_queue.push(curr);
    }

    // 将剩余元素放回全局队列
    while (!temp_queue.empty()) {
        global_queue.push(temp_queue.front());
        temp_queue.pop();
    }
}

int main() {
    // 示例输入(对应预期输出1、4、2)
    insert(0, 1);
    query(0);       // 输出1
    insert(0, 4);
    delete_front(0); // 删除Q0的队首元素1
    query(0);       // 输出4
    insert(1, 2);
    query(1);       // 输出2

    return 0;
}

代码说明

  • 用临时队列temp_queue缓存遍历过程中的元素,确保全局队列的元素相对顺序不会被破坏
  • 查询操作会完整遍历队列,找到第一个目标队列的元素后输出,同时保留所有元素的顺序
  • 删除操作会跳过第一个目标队列的元素,其余元素按原顺序放回,实现队首删除的效果
  • 所有操作严格遵循FIFO规则,符合多队列的模拟需求

内容的提问来源于stack exchange,提问作者Keya Rani Mondal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:02:04