栈和队列(2)----排序
一、题目:仅用递归函数和栈操作逆序一个栈
将一个栈里面的元素逆序,只能用递归函数来实现,不能用其他数据结构。
- 只能用递归函数来实现
- 可以使用现成的栈类型
思路:
为了将栈逆序,只需要按顺序将栈顶至栈底的元素拿出并移除,放置到栈顶中,这样就可以将栈逆序。
两个递归函数:
一个将栈底元素取出。
一个将剩下的栈元素逆序。
如:
输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。
// 我们再来考虑怎么递归。我们把栈{1, 2, 3, 4, 5}看成由两部分组成:栈顶元素1和剩下的部分{2, 3, 4, 5}。如果我们能把{2, 3, 4, 5}颠倒过来,变成{5, 4, 3, 2},然后在把原来的栈顶元素1放到底部,那么就整个栈就颠倒过来了,变成 {5, 4, 3, 2, 1}。
// 接下来我们需要考虑两件事情:一是如何把{2, 3, 4, 5}颠倒过来变成{5, 4, 3, 2}。我们只要把{2, 3, 4, 5}看成由两部分组成:栈顶元素2和剩下的部分{3, 4, 5}。
// 我们只要把{3, 4, 5}先颠倒过来变成{5, 4, 3},然后再把之前的栈顶元素2放到最底部,也就变成了{5, 4, 3, 2}。
// 至于怎么把{3, 4, 5}颠倒过来……这就是递归。也就是每一次试图颠倒一个栈的时候,现在栈顶元素pop出来,
// 再颠倒剩下的元素组成的栈,最后把之前的栈顶元素放到剩下元素组成的栈的底部。递归结束的条件是剩下的栈已经空了
代码:
import queue stack = queue.LifoQueue() for i in range(1,6): stack.put(i) #第一个取出栈底元素的递归函数 def getLast(stack): if stack.empty(): return result = stack.get() if stack.empty(): return result else: last = getLast(stack) stack.put(result) return last #第二个递归,逆序 def reverse(stack): if stack.empty(): return last = getLast(stack) reverse(stack) stack.put(last) # print(stack.empty) reverse(stack)
二、题目:用一个栈实现另一个栈的排序
一个栈中元素的类型为整型,若将栈从顶到底按从大到小的顺序排序,只许申请一个栈。可以申请新的变量,但不能申请额外的数据结构。
思路:
代码:
def getFirst(stack): first = stack.get() stack.put(first) return first def sortstack(stack): if stack.empty(): return helper = queue.LifoQueue() while not stack.empty(): cur = stack.get() while not helper.empty() and getFirst(helper) < cur: stack.put(helper.get()) helper.put(cur) while not helper.empty(): stack.put(helper.get()) return stack