基于队列标准接口移除头部重复元素的实现咨询
解决方案:仅用队列标准接口移除头部重复元素
你的思路完全正确——把队列所有元素出队,再重新入队那些与原队首元素不相等的元素,这个方法完全符合仅使用标准队列接口的要求,而且逻辑清晰易实现。
实现步骤拆解
- 获取基准重复值:先拿到队列头部的元素,这就是我们需要批量移除的目标值(题目明确重复元素仅在头部)。
- 暂存有效元素:用一个临时队列来保存所有不等于基准值的元素,避免直接出队丢失数据。
- 统计移除数量:在出队原队列元素的过程中,计数所有等于基准值的元素个数。
- 恢复有效队列:把临时队列里的元素重新放回原队列,恢复队列的正常顺序。
- 清理临时资源:销毁临时队列,避免内存泄漏(如果队列是动态分配的话)。
修改后的完整函数实现
#include "Queue.h" // 假设你的队列定义在这个头文件里 int dequeueEquivalent(Queue* queue) { // 处理空队列的边界情况 if (queueEmpty(queue)) { return 0; } int removedCount = 0; int target = front(queue); // 获取头部的重复基准值 Queue tempQueue; initializeQueue(&tempQueue); // 初始化临时队列 // 遍历原队列,分离重复元素和有效元素 while (!queueEmpty(queue)) { int current = dequeue(queue); if (current == target) { removedCount++; } else { enqueue(&tempQueue, current); // 有效元素存入临时队列 } } // 将临时队列的元素放回原队列 while (!queueEmpty(&tempQueue)) { enqueue(queue, dequeue(&tempQueue)); } // 销毁临时队列(根据你的队列实现,可能需要对应销毁函数) // destroyQueue(&tempQueue); // 如果有销毁函数的话记得调用 return removedCount; }
关键细节说明
- 边界处理:先判断队列是否为空,避免调用
front()或dequeue()时出错。 - 临时队列的作用:因为队列是FIFO结构,直接出队原队列元素会丢失后续需要保留的元素,所以必须用临时队列暂存,保证有效元素的顺序不变。
- 符合接口要求:全程只使用了题目规定的
initializeQueue()、enqueue()、dequeue()、front()、queueEmpty()这几个标准接口,没有直接操作队列的head或tail指针。
测试示例验证
对于初始队列为[1,1,1,4,5]的情况:
- 基准值
target为1。 - 出队所有元素:3个1被计数,4和5存入临时队列。
- 把临时队列的4、5放回原队列,最终原队列为
[4,5],函数返回移除数量3,完全符合预期。
内容的提问来源于stack exchange,提问作者Darke
相关产品推荐
相关产品推荐

