技术问询:如何优化队列镜像函数实现原序+逆序拼接输出
解决队列镜像:实现原序+逆序拼接的方法
嘿,我来帮你搞定这个队列镜像的问题!你的现有代码只是把队列里的元素依次出队再重新入队,所以队列内容和原来完全一致,并没有实现「原序排列后拼接逆序元素」的需求。下面给你两种可行的解决方案:
方法一:用临时列表保存原元素(无需栈)
这种方法思路简单,先备份原队列的所有元素,再分别把原序和逆序元素入队:
def mirror_queue(orig_queue): # 先把原队列所有元素出队,保存到临时列表 temp_list = [] # 假设队列有is_empty()方法判断是否为空;如果没有,可改用 len(orig_queue.items) > 0 while not orig_queue.is_empty(): temp_list.append(orig_queue.dequeue()) # 第一步:重新入队原元素,恢复原队列的原序 for item in temp_list: orig_queue.enqueue(item) # 第二步:把临时列表逆序后入队,实现逆序拼接 for item in reversed(temp_list): orig_queue.enqueue(item)
逻辑说明:
- 先清空原队列并保存所有元素到
temp_list,这样我们同时拿到了原队列的完整元素顺序; - 把
temp_list的元素重新入队,让队列回到初始的原序状态; - 用
reversed()遍历temp_list,把逆序的元素逐个入队,最终队列就变成「原序+逆序」的组合。
方法二:用栈辅助实现逆序(利用栈的后进先出特性)
如果必须使用你提到的my_stack_module,可以用栈来完成元素反转:
import my_stack_module def mirror_queue(orig_queue): backup_stack = my_stack_module.Stack() temp_list = [] # 把原队列元素出队,同时存入临时列表和栈 while not orig_queue.is_empty(): item = orig_queue.dequeue() temp_list.append(item) backup_stack.push(item) # 恢复原队列的原序 for item in temp_list: orig_queue.enqueue(item) # 弹出栈中元素并入队,栈的弹出顺序就是原队列的逆序 while not backup_stack.is_empty(): orig_queue.enqueue(backup_stack.pop())
逻辑说明:
- 栈的「后进先出」特性刚好可以帮我们反转元素顺序,所以先把原队列元素全部存入栈和临时列表;
- 临时列表用来恢复原队列的原序;
- 逐个弹出栈中的元素并加入队列,这些元素就是原队列的逆序,最终实现拼接效果。
关于你之前尝试的.reverse()方法
你之前用.reverse()只得到逆序队列,是因为你直接修改了原队列的元素顺序,没有先保留原序部分。上面两种方法都是先确保原序元素完整保留,再添加逆序元素,所以能满足输入[1,2,3]输出[1,2,3,3,2,1]的需求。
内容的提问来源于stack exchange,提问作者mini
相关产品推荐
相关产品推荐

