1 题目
leetcode
用两个栈实现队列。队列的声明如下,请实现它的两个函数 appendTail和deleteHand,分别完成在队尾插入整数和在队列头部删除整数的功能。(若队列中没有元素,deletehand操作返回-1)
2 解
2.1 主栈和辅助栈
维护两个栈,压入时直接压入主栈,取出时将主栈元素压入辅助栈,取辅助栈栈顶元素,再将辅助栈元素压入主栈中。
class CQueue {
Stack<Integer> mainStack;
Stack<Integer> SupportStack;
public CQueue() {
mainStack=new Stack<>();
SupportStack=new Stack<>();
}
public void appendTail(int value) {
//往主栈中压入
mainStack.push(value);
}
public int deleteHead() {
//主栈为空
if(mainStack.isEmpty())
return -1;
//主栈非空
//将主栈的元素压入辅助栈,辅助栈顶的元素即是想要的元素,最后将辅助栈的元素压回主栈。
//压入辅助栈
while (!mainStack.isEmpty()) {
SupportStack.push(mainStack.pop());
}
//取出辅助栈顶元素
int res=SupportStack.pop();
//剩余元素压入主栈
while (!SupportStack.isEmpty()) {
mainStack.push(SupportStack.pop());
}
return res;
}
}
想来想去还是无法突破两次while循环
3 官解
官解的思路是维护两个栈,一个用于插入,一个用于删除,插入时直接插入插入栈,删除时判断删除栈是否为空,为空则将插入栈的内容放入删除栈并删除栈顶元素,放入后的删除栈也为空就返回-1,注意删除栈的元素没有放回插入栈中。
class CQueue {
Stack<Integer> insertStack;
Stack<Integer> deleteStack;
public CQueue() {
insertStack=new Stack<>();
deleteStack=new Stack<>();
}
public void appendTail(int value) {
//往插入栈中压入
insertStack.push(value);
}
public int deleteHead() {
//删除栈为空
if(deleteStack.isEmpty()) {
//将插入栈的元素放入删除栈中
while (!insertStack.isEmpty()) {
deleteStack.push(insertStack.pop());
}
}
//删除栈仍为空
if(deleteStack.isEmpty())
return -1;
//非空则返回栈顶元素
return deleteStack.pop();
}
}
4 参考链接
1.官解