多队列三操作实现问题: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操作,核心问题是查询/删除指定队列元素时,未正确遍历队列找到目标元素,也未维护全局队列的元素顺序。
错误原因
原实现的逻辑缺陷:
- 查询或删除指定队列的队首时,仅检查队列头部的少数元素,未完整遍历队列找到第一个属于目标队列的元素
- 处理非目标队列元素时,未正确维护全局队列的元素相对顺序,导致后续操作的元素位置混乱
修正方案
通过临时队列辅助遍历,确保:
- 查询操作:遍历全局队列找到第一个目标队列的元素,输出后将所有元素按原顺序放回全局队列
- 删除操作:遍历全局队列,跳过第一个目标队列的元素,将其余元素按原顺序放回全局队列
- 插入操作:直接将
<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
相关产品推荐
相关产品推荐

