如何仅使用单个队列元素类型变量与单个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 } }
给你拆解下细节:
- 空队列判断是基本的边界处理,避免后续操作出错;
- 统计元素数的过程很巧妙:出队+计数+入队的操作不会改变队列的元素顺序,但我们成功拿到了总元素数
count; - 反转的核心操作:每次把
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ć
相关产品推荐
相关产品推荐

