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

如何仅使用单个队列元素类型变量与单个int变量实现队列反转函数QuReverse?

如何仅使用单个队列元素类型变量与单个int变量实现队列反转函数QuReverse?

我完全懂你当时卡壳的感觉——用栈做反转简直是条件反射,但被死死限制只能用两个变量的时候,确实有点烧脑。不过别遗憾,这个需求真的能实现,核心就是利用队列本身的空间做「原地」反转,完全符合题目给的变量限制。

先给你理清楚核心逻辑:

  • 我们不需要额外的栈或者新队列,就用原队列的现有空间;
  • 第一步先悄悄统计出队列的总元素数:把每个元素逐个出队,用那个int变量计数,然后立刻重新入队——这样队列结构完全不变,但我们拿到了总元素数量;
  • 第二步从总元素数开始递减处理:假设总共有n个元素,我们先把前n-1个元素移到队尾,这样原来的最后一个元素就会跑到队首;然后把n减1,重复这个操作,直到n变成1(剩下的最后一个元素不用动,队列已经完全反转)。

这里的单个元素变量就是用来临时存出队的元素,再入队;而int变量就是用来记录总元素数,以及后续每次需要移动的元素数量。

接下来是具体的代码实现,完全贴合你的变量限制:

#include "queue.h" // 假设这是你的队列定义头文件

void QuReverse(Queue *Q) {
    // 空队列直接返回,避免无效操作
    if (QuEmpty(Q)) {
        return;
    }

    // 仅有的两个额外变量:队列元素类型、int类型各一个
    QueueElementType temp;
    int count = 0;

    // 第一步:统计队列总元素数,同时保持队列原有顺序不变
    while (!QuEmpty(Q)) {
        temp = QuDequeue(Q);
        count++;
        QuEnqueue(Q, temp);
    }

    // 第二步:循环调整元素位置,完成反转
    while (count > 1) {
        // 把当前count-1个元素从队首移到队尾
        for (int i = 0; i < count - 1; i++) {
            temp = QuDequeue(Q);
            QuEnqueue(Q, temp);
        }
        count--; // 下一轮处理的元素数量减1
    }
}

给你拆解下细节:

  1. 空队列判断是基本的边界处理,避免后续操作出错;
  2. 统计元素数的过程很巧妙:出队+计数+入队的操作不会改变队列的元素顺序,但我们成功拿到了总元素数count;
  3. 反转的核心操作:每次把count-1个元素移到队尾,相当于把原本的队尾元素“推”到了队首的正确位置。比如总共有5个元素,第一次移4个到队尾,第5个元素就到了队首;接着count变成4,再移3个到队尾,第4个元素就到了队首的下一个位置……以此类推,直到count=1,所有元素都归位完成反转。

如果严格抠“只能用一个int变量”(连循环临时变量都不能有),我们也可以把内部循环改成while,复用同一个int变量:

// 替换第二步的循环
while (count > 1) {
    count--;
    int current = count;
    while (current > 0) {
        temp = QuDequeue(Q);
        QuEnqueue(Q, temp);
        current--;
    }
}

其实不管哪种写法,核心都是利用队列的循环特性,把原队列当临时空间来调整元素位置。你用栈拿一半分确实有点可惜,但下次遇到这种限制型问题,不妨先想想能不能用原数据结构的空间做原地操作,往往能找到突破口。

备注:内容来源于stack exchange,提问作者Luka Malović

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 11:19:53