剑指offer 09题 用两个栈实现队列 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 来源:力扣(LeetCode) /** * 使用两个栈实现队列:栈不能取栈底的元素,所以需要两个栈倒来倒去 * 入队列,使用mIn栈,将目前所有元素从mOut栈倒入mIn栈(此时次序已经变换),然后将新的数据添加到mIn栈顶,即完成添加到队列尾部元素 * 出队列,使用mOut栈,将目前所有元素从mIn栈倒入mOut栈(此时。。。),然后将mOut栈顶元素pop,即完成删除队列首部元素 */
1.初次操作
class CQueue {
private Stack<Integer> mIn = null;
private Stack<Integer> mOut = null;
private int mCount;
public CQueue() {
mIn = new Stack<Integer>();
mOut = new Stack<Integer>();
mCount = 0;
}
public void appendTail(int value) {
while(!mOut.isEmpty())
mIn.push(mOut.pop());
mIn.push(value);
mCount ++;
}
public int deleteHead() {
if (mCount == 0)
return -1;
while (!mIn.isEmpty())
mOut.push(mIn.pop());
mCount --;
return mOut.pop();
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
1.所犯错误:mCount 一开始写成了mOut,导致编译错误。
执行用时:191 ms, 在所有 Java 提交中击败了13.83%的用户 /内存消耗:46.5 MB, 在所有 Java 提交中击败了80.18%的用户
2.参考别人的解法
import java.util.Stack;
class CQueue {
Stack<Integer> stack1;
Stack<Integer> stack2;
// 构造函数
public CQueue() {
// 构造两个栈
stack1 = new Stack<Integer>();
stack2 = new Stack<Integer>();
}
// 在队尾插入元素
public void appendTail(int value) {
// stack1作为主要元素,用于模拟队列
stack1.push(value);
}
// 在队首删除元素
public int deleteHead() {
// 删除队首元素,即删除stack1的栈底元素
// 将stack1的所有元素出栈,并存入stack2,那么此时要删除的栈底元素就是stack2的栈顶元素
if(!stack2.empty()){
return stack2.pop();
}
if(stack1.empty()){
return -1;
}
while(!stack1.empty()){
int temp = stack1.pop();
stack2.push(temp);
}
return stack2.pop();
}
}
2.一开始没看懂的地方在于,这种解法不在乎队列的“队形”,只保证先进先出的,即有可能存在一半元素在stack1,一半元素在stack2,且没有占用mCount的内存空间。 if(!stack2.empty()) 只有stack2 已经有元素才会为真。