使用递归在Python中反转堆栈

时间:2012-03-13 15:20:45

标签: python recursion

我正在做一些练习题。这个需要在不使用除另一个堆栈之外的任何其他数据结构的情况下反转堆栈。

我知道我需要一个辅助函数,在原始堆栈为空时附加弹出的数字。

有人可以让我开始吗?我被困在这里

def flip_stack(s):
    if not s.is_empty():
        temp = s.pop
        flip_stack(s)

谢谢!

Stack类具有poppushis_empty函数。

6 个答案:

答案 0 :(得分:1)

def reverse(orig, reversel=None):
    if not reversel:
        reversel = []
    reversel.append(orig.pop())
    if orig:
        reverse(orig, reversel)
    return reversel

stack = [1, 2, 3, 4, 5]
stack = reverse(stack)
print stack
[5, 4, 3, 2, 1]

答案 1 :(得分:0)

如果stack是本机Python列表,则以下情况有效:

def flip(stack):
    def helper(old_stack, new_stack):
        if old_stack:
            new_stack.append(old_stack.pop())
            return helper(old_stack, new_stack)
        else:
            return new_stack
    return helper(stack[:], [])

stack[:]会导致原始堆栈被保留。

修改它以处理给定的Stack类应该不难。

答案 2 :(得分:0)

这是另一种可能性,使用累加器和辅助函数。我只使用你的Stack类中提供的方法,而没有其他数据结构(例如Python的列表):

def flip_stack(s):
    return flip_stack_helper(s, Stack()) # Stack is your stack class

def flip_stack_helper(s, t):
    if s.is_empty():
        return t
    t.push(s.pop())
    return flip_stack_helper(s, t)

请注意原始堆栈最后会为空,并返回翻转的堆栈。

答案 3 :(得分:0)

>>> liste = [1, 2, 3, 4, 5]
>>> liste[::-1]
[5, 4, 3, 2, 1]

答案 4 :(得分:0)

假设不应该使用任何数据结构,即使没有列表来保存最终结果也是一种可能的解决方案

此处的堆栈将被视为支持以下功能的列表

append(elem)   ---- push(elem) 
pop()          ---- pop() 
if <some stack>---- NotEmpty()

解决方案1:

def flip_stack(s):
    while True:
        if s:
            yield s.pop()
        else:
            return

stack = [1,2,3,4,5]
revStack = [x for x in flip_stack(stack)]

即使您可以在不使用IsEmpty或NotEmpty功能的情况下进行编码

解决方案2:

def flip_stack(s):
    while True:
        try:
            yield s.pop()
        except IndexError:
            return

注意 * *在条件检查中使用异常是Python中可接受的行为,因为它没有像在C ++中那样增加额外开销

答案 5 :(得分:0)

class Stack(object):
    def __init__(self,items=[]):
        self.stack = items

    def is_empty(self):
        return not self.stack

    def pop(self):
        return self.stack.pop()

    def push(self,val):
        self.stack.append(val)

    def __repr__(self):
        return "Stack {0}".format(self.stack)

def flip_stack(stack):
    def flip_stack_recursive(stack,new_stack=Stack()):
        if not stack.is_empty():
            new_stack.push(stack.pop())
            flip_stack_recursive(stack,new_stack)
        return new_stack
    return flip_stack_recursive(stack)


s = Stack(range(5))
print s
print flip_stack(s)

产量

Stack [0, 1, 2, 3, 4]
Stack [4, 3, 2, 1, 0]

你甚至可以使用闭包保持stack的{​​{1}}参数在递归函数范围内的事实,因此你不需要它作为参数内在的功能。 e.g。

flip_stack

或者,去掉递归函数上的所有参数,你的线程堆栈框架会感谢你:

def flip_stack(stack):
    def flip_stack_recursive(new_stack):
        if not stack.is_empty():
            new_stack.push(stack.pop())
            flip_stack_recursive(new_stack)
        return new_stack
    return flip_stack_recursive(Stack())