剑指 Offer 09. 用两个栈实现队列 Python3+Java
使用两个栈构造一个队列类,加了详细的注释,方便自己日后复习,同时也希望可以帮助其他人,如有错误,欢迎指正
Python代码:
class CQueue:
# 一个用双栈实现的队列,即先进先出
def __init__(self):
# 初始化两个栈,stack_a用来新增元素,stack_b用来翻转栈,并返回翻转后的最后一个元素
self.stack_a = []
self.stack_b = []
# 队列尾部插入整数
def appendTail(self, value: int) -> None:
self.stack_a.append(value)
# 队列头部删除整数
def deleteHead(self) -> int:
# 如果stack_b不为空,直接返回stack_b的最后一个元素即可
if self.stack_b:
return self.stack_b.pop()
# 到这一步说明stack_b为空,若进一步满足stack_a为空,说明两个栈都已经没有没有元素了,返回-1
if not self.stack_a:
return -1
# 到了这一步,说明stack_b为空,stack_a不为空,那么就把stack_a中的元素逐个弹出并压入stack_b
while self.stack_a:
self.stack_b.append(self.stack_a.pop())
# 返回stack_b的最后一个元素
return self.stack_b.pop()
Java代码:
class CQueue {
// 提前声明成员变量,让所有类中的方法都可以访问这两个栈
// 其他代码和Python基本一致
Stack<Integer> stack_a;
Stack<Integer> stack_b;
public CQueue() {
stack_a = new Stack<Integer>();
stack_b = new Stack<Integer>();
}
public void appendTail(int value) {
stack_a.push(value);
}
public int deleteHead() {
if (!stack_b.isEmpty()){
return stack_b.pop();
}
if (stack_a.isEmpty()){
return -1;
}
while (!stack_a.isEmpty()){
stack_b.push(stack_a.pop());
}
return stack_b.pop();
}
}