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

基于队列标准接口移除头部重复元素的实现咨询

解决方案:仅用队列标准接口移除头部重复元素

你的思路完全正确——把队列所有元素出队,再重新入队那些与原队首元素不相等的元素,这个方法完全符合仅使用标准队列接口的要求,而且逻辑清晰易实现。

实现步骤拆解

  1. 获取基准重复值:先拿到队列头部的元素,这就是我们需要批量移除的目标值(题目明确重复元素仅在头部)。
  2. 暂存有效元素:用一个临时队列来保存所有不等于基准值的元素,避免直接出队丢失数据。
  3. 统计移除数量:在出队原队列元素的过程中,计数所有等于基准值的元素个数。
  4. 恢复有效队列:把临时队列里的元素重新放回原队列,恢复队列的正常顺序。
  5. 清理临时资源:销毁临时队列,避免内存泄漏(如果队列是动态分配的话)。

修改后的完整函数实现

#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]的情况:

  1. 基准值target为1。
  2. 出队所有元素:3个1被计数,4和5存入临时队列。
  3. 把临时队列的4、5放回原队列,最终原队列为[4,5],函数返回移除数量3,完全符合预期。

内容的提问来源于stack exchange,提问作者Darke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:34:05