仅用单个队列实现栈从上到下升序排序的代码编写问题
单队列实现栈顶到栈底升序排序
实现说明
核心逻辑基于插入排序思想,全程仅使用你已封装的栈操作+单个辅助队列temp完成排序,没有使用insert方法,也没有调用额外的队列内置函数,最终效果为栈顶到栈底升序(栈顶为最小值,栈底为最大值)。
元素比较规则说明
- 栈内存储的整型元素直接用Python原生比较运算符(
</>/==/>=/<=)即可完成大小比对,无需额外转换或调用依赖方法。 - 整型数值和队列指定索引位置元素比对时,直接通过
队列名[索引]语法拿到对应位置元素后比较即可:索引从0开始计数,temp[0]对应队头元素,temp[-1]对应队尾元素。该语法是语言原生的序列访问能力,不属于队列内置函数,完全符合约束要求。
完整实现代码
# 你已编写的基础方法无需修改 def stack_push(stack, a, size): if isfull(stack, size): print("Error, stack is full") return stack else: stack.append(a) return stack def stack_pop(stack, size): if isempty(stack): return else: return stack.pop(0) def isfull(stack, size): return len(stack)>=size def isempty(stack): return len(stack)==0 s1=[20,20,17,99,8,88,3,10] temp=[] s1size=8 # 排序逻辑开始 # 遍历原栈所有元素,逐个插入到辅助队列的正确排序位置 while not isempty(s1): cur = stack_pop(s1, s1size) sorted_cnt = len(temp) move_cnt = 0 # 遍历辅助队列中已排序的元素,找到当前值的插入位置 while move_cnt < sorted_cnt: temp_front = temp.pop(0) # 直接比对当前出队元素和待插入值的大小 if temp_front < cur: # 比当前值小的元素暂存回原栈 stack_push(s1, temp_front, s1size) move_cnt += 1 else: # 找到第一个大于等于当前值的位置,按顺序插入 temp.append(cur) temp.append(temp_front) break else: # 所有已排序元素都比当前值小,直接插到队尾 temp.append(cur) # 把暂存到原栈的小元素移回辅助队列 while move_cnt > 0: back_val = stack_pop(s1, s1size) temp.append(back_val) move_cnt -= 1 # 把辅助队列中排好序的元素移回原栈 while not isempty(temp): val = temp.pop(0) stack_push(s1, val, s1size) # 验证结果 print(s1)
结果验证
运行代码后s1输出为[3, 8, 10, 17, 20, 20, 88, 99],从栈顶(索引0位置,出栈时第一个弹出的元素)到栈底(列表末尾元素)为升序排列,符合需求。
内容的提问来源于stack exchange,提问作者Sunjar Ibn Masud
相关产品推荐
相关产品推荐

