面试题 09 用两个栈实现队列(Python3)

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例 1:

输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]


示例 2:

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

原始代码为:

class CQueue:

    def __init__(self):

    def appendTail(self, value: int) -> None:

    def deleteHead(self) -> int:


# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()

 

那么第一个问题来了:读不懂题!输入输出是啥玩意啊

答: 输入是操作和对应的输入值.

如操作是appendTail ,则对应的输入值只能是数字或[]; deleteHead输入值则只能是[]。

同理, 输出时,只有deleteHead有返回值,其余都是null。

具体如下面两图所示:

 

解题思路

  • 构造两个栈(用list表示),一个是A,一个是B;
  • 其中,A的顺序与队列相同,B则与A相反。
  • 当appendTail的时候,A append一个元素,同时更新B(即B=A[::-1])
  • 当deleteHead的时候,去掉队列的第一个元素即对比进行pop操作并返回pop的值,pop后更新A(即A=B[::-1])即可.当然,若此时B已经是null的,则直接返回-1,且该情况下无须更新A。

 

 

 

 

代码

class CQueue:

    def __init__(self):
        self.A = [] # 第一个栈,表示队列
        self.B = [] # 第二个栈,表示队列的逆(逆队列)

    def appendTail(self, value: int) -> None:
        # append时只需要在A后面append即可
        self.A.append(value)
        # 除此之外,还要更新B
        self.B = self.A[::-1]

    def deleteHead(self) -> int:
        if self.B:
            result = self.B.pop() # 返回B的第一个元素
            self.A = self.B[::-1]   # 更新A
            return result
        else:   # b是空的,且此时A=B,因此不需要对A判断且可直接返回-1   
            return -1 

# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()

结果

 

总结

  • append和pop的运用。两个操作均针对list的尾部,且pop可有返回值;
  • 由两个栈完成对一个队列的操作值得注意。
  • 此题在明白题意后书写起来并不困难,但这也和这几天做的题有关,继续坚持吧。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章