用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
image.png
解题思路:
- 维护两个栈,
stack1
用来处理插入操作,stack2
用来处理删除操作; - 当执行插入操作时,直接将插入值加入到
stack1
中,stack1.append(val)
; - 当执行删除操作时,先判断
stack2
是否为空,如果为空,将stack1
中数据弹入到stack2
中,例如[1,2,3]
加入stack1
再弹出的顺序是[3,2,1]
,那么弹入到stack2
后从顶向底则是[1,2,3]
; - 再判断
stack2
是否为空,若仍为空,则表示没有数据从stack1
进入stack2
,返回-1; - 若不为空,弹出的顺序即是
[1,2,3]
,和弹入到stack1
的顺序一致,符合队列的先进先出规律。
Python3代码:
class CQueue:
def __init__(self):
self.stack1 = []
self.stack2 = []
def appendTail(self, value: int) -> None:
self.stack1.append(value)
def deleteHead(self) -> int:
if not self.stack2:
while self.stack1:
self.stack2.append(self.stack1.pop())
if not self.stack2:
return -1
else:
return self.stack2.pop()
# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()
# 实现peek和empty方法
class MyQueue:
def __init__(self):
"""
Initialize your data structure here.
"""
self.A = []
self.B = []
def push(self, x: int) -> None:
"""
Push element x to the back of queue.
"""
self.A.append(x)
def pop(self) -> int:
"""
Removes the element from in front of queue and returns that element.
"""
if not self.B:
while self.A:
self.B.append(self.A.pop())
if not self.B:
return -1
else:
return self.B.pop()
def peek(self) -> int:
"""
Get the front element.
"""
if not self.B:
while self.A:
self.B.append(self.A.pop())
if not self.B:
return None
else:
return self.B[-1]
def empty(self) -> bool:
"""
Returns whether the queue is empty.
"""
if self.A or self.B:
return False
else:
return True
# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()
网友评论