剑指Offer 09:用两个栈实现队列
2022年2月17日
一、问题描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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]
提示:
- 1 <= values <= 10000
- 最多会对 appendTail、deleteHead 进行 10000 次调用
二、问题分析
- 问题的核心在于如何使用两个栈来实现一个队列。
- 设两个栈分别为a和b,由于a和b都是先进后出,先进a的元素反而在a的底部,所以我们可以逐个把a中的元素移到b中,这样先进a的元素就会在b的顶部,再对b出栈即可。
- 代码的实现机理如下:(a)添加元素时进行对a进栈;(b)删除元素时判断b是否为空,若为空则依次将a中的元素移到b中,再对b出栈;(c)若b不为空,则直接对b出栈。
三、解题代码
class CQueue(object):
def __init__(self):
self.stack_pop = []
self.stack_push = []
def appendTail(self, value):
"""
:type value: int
:rtype: None
"""
self.stack_push.append(value)
def deleteHead(self):
"""
:rtype: int
"""
if len(self.stack_pop) == 0 and len(self.stack_push) == 0:
return -1
else:
if len(self.stack_pop) == 0:
while len(self.stack_push) != 0:
value = self.stack_push.pop()
self.stack_pop.append(value)
return_value = self.stack_pop.pop()
else:
return_value = self.stack_pop.pop()
return return_value
总结
用两个栈来实现一个队列,其关键在于将栈a中的元素依次移到栈b中,从而实现元素的逆序。