“翻转栈的所有元素” python语言

题目描述:翻转栈的所有元素,例如输入栈{1,2,3,4,5},其中,1处在栈顶,翻转之后的栈为{5,4,3,2,1},其中,5处在栈顶:

看到这题,我第一个想到的方法便是申请一个额外的队列,先把栈中的元素依次出栈放到队列里,然后把队列里的元素队列的顺序入栈,来实现翻转,但是空间复杂度较高。因此选用了复杂度较低的递归的方法。

思路:先将栈底元素移到栈顶,然后递归调用出栈顶元素的子栈。(把不包含该栈顶元素的子栈的栈底的元素移动到子栈的栈顶,然后把栈顶的元素与子栈栈顶的元素进行交换。)

class Stack:
    # 实现栈的功能
    def __init__(self):
        self.items = []

    # 判断栈是否为空
    def empty(self):
        return self.items == None
    
    # 返回栈的大小
    def size(self):
        return len(self.items)

    # 返回栈顶元素
    def peek(self):
        if not self.empty():
            return self.items[len(self.items) - 1]
        else:
            return None

    # 弹栈
    def pop(self):
        if len(self.items) > 0:
            return self.items.pop()
        else:
            print("空栈")
            return None

    # 压栈
    def push(self, items):
        self.items.append(items)

def moveBottomToTop(s):
    """把栈底元素移动到栈顶"""
    if s.empty():  # 判断是否为空  s:栈的引用
        return
    top1 = s.peek()  # 返会栈顶元素
    s.pop()  # 弹栈
    if not s.empty():
        # 递归处理不包含栈的子栈
        moveBottomToTop(s)
        top2 = s.peek
        # 交换栈顶元素与子栈栈顶元素
        s.push(top1)
        s.push(top2)
    else:
        s.push(top1)

def reverse_stack(s):
    if s.empty():
        return
    # 把栈顶元素移到栈顶
    moveBottomToTop(s)
    top = s.peek()
    s.pop()
    # 递归处理子栈
    reverse_stack(s)
    s.push(top)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值