如何仅用递归函数和栈操作逆序一个栈

48 篇文章 0 订阅

题目:
只使用递归跟栈的操作,实现逆序栈

思路:
1.先实现一个栈

class Stack:
    def __init__(self):
        self.s = []


    def push(self, data):
        self.s.append(data)


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


    def empty(self):
        return len(self.s) == 0


    def dump(self):
        print(self.s)

测试:

def test_stack():
    stack = Stack()
    for i in range(5):
        stack.push(i)

    stack.dump()

结果:

➜  3_reverse_stack_using_recursion python reverse_stack_using_recursion.py
[0, 1, 2, 3, 4]

2.递归实现逆序打印栈

def reverse_print(stack):
    if stack.empty():
        return

    a = stack.pop()
    reverse_print(stack)
    print(a)

测试:

def test_reverse_print():
    stack = Stack()
    for i in range(5):
        stack.push(i)
    
    stack.dump()
    reverse_print(stack)

结果:

➜  3_reverse_stack_using_recursion python reverse_stack_using_recursion.py
[0, 1, 2, 3, 4]
0
1
2
3
4

3.递归实现获取,并移除栈中最底下的元素
跟逆序输出类似:

def get_and_remove_last(stack):
    if stack.empty():
        raise Exception('Empty stack')

    a = stack.pop()
    if not stack.empty():
        last = get_and_remove_last2(stack)
        stack.push(a)
        return last
    else:
        return a

测试:

def test_get_and_remove_last():
    stack = Stack()
    for i in range(5):
        stack.push(i)

    stack.dump()
    for i in range(5):
        last = get_and_remove_last(stack)
        print('last:', last)
        stack.dump()

结果:

➜  3_reverse_stack_using_recursion python reverse_stack_using_recursion.py
[0, 1, 2, 3, 4]
last: 0
[1, 2, 3, 4]
last: 1
[2, 3, 4]
last: 2
[3, 4]
last: 3
[4]
last: 4
[]

4.在上面函数的基础上,再加一层递归,就可以实现逆序

def reverse(stack):
    if stack.empty():
        return

    a = get_and_remove_last(stack)
    reverse(stack)
    stack.push(a)

测试:

def test_reverse():
    stack = Stack()
    for i in range(5):
        stack.push(i)

    stack.dump()
    reverse(stack)
    stack.dump()

结果:

➜  3_reverse_stack_using_recursion python reverse_stack_using_recursion.py
[0, 1, 2, 3, 4]
[4, 3, 2, 1, 0]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值