【牛客】剑指offer5-用两个栈实现队列

解题思路:

栈无法实现队列功能:栈底元素(对应队首元素)无法直接删除,需要将上方所有元素出栈。

双栈可实现列表倒序:设有含三个元素的栈A=[1,2,3]和空栈B=[]。若循环执行A元素出栈并添加入栈B,直到栈A为空,则A=[],B=[3, 2, 1],即栈B实现栈A元素倒序。

利用栈B删除队首元素:倒序后,B执行出栈相当于删除了A的栈底元素,即对应队首元素

 

 

 

 

 

函数设计:

题目要求实现加入队尾appendTail()和删除队首deleteHead()两个函数的正常工作,因此我们可以设计栈A用于加入队尾操作,栈B用于将元素倒序,从而实现删除队首元素。

 

加入队尾appendTail()函数:将数字val加入栈A即可

删除队首deleteHead()函数,有以下三种情况:

case1:当栈B不为空

即B中仍有已完成倒序的元素,因此直接返回B的栈顶元素。

case2:当栈B为空

    若A为空:即两个栈都为空,此时没有元素,返回-1

    若A不为空:将栈A元素全部转移至栈B中,实现元素倒序,并返回栈B的栈顶元素

 

代码:

#coding:utf-8

# 用两个栈实现队列

class Solution:
    def __init__(self):
        self.A,  self.B = [],[]

    def appendTail(self, value):
        """

        :param value: int
        :return: None
        """
        self.A.append(value)

    def deleteHead(self):
        """

        :return: int
        """
        if self.B:
            return self.B.pop()
        if not self.A:
            return -1
        while self.A:
            self.B.append(self.A.pop())
        return self.B.pop()

 

 

Reference

1.题解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值