原题
剑指offer 09.用两个栈实现队列
2020年6月30日 每日一题
题解
方法一
既然题目说了是两个栈实现队列,那么我们不妨设立两个栈,一个用于正常的push,另一个辅助用作从尾部pop。
a栈的作用是在push的时候加入元素,在执行加入元素的时候,没有b栈什么事儿。而当有指令“从尾部删除”的时候,我们需要把a栈中的元素全部pop并马上push进b中,这样b中从上到下就a中元素从早到晚的元素了。当b没空的时候,不用关心a,只是从b里面往外pop就好;但是b空了的时候,需要重新把a中的元素,全部pop并马上push进b中,之后在执行b.pop();;最后,假如某一时刻,发现a和b都空了,就返回默认-1咯。
(另外注意学一下LinkedList和Deque的知识)
本思路java代码示例:
/*
@v7fgg
执行用时:55 ms, 在所有 Java 提交中击败了85.59%的用户
内存消耗:47.6 MB, 在所有 Java 提交中击败了100.00%的用户
2020年6月30日 8:52
*/
class CQueue {
Stack<Integer> a,b;
public CQueue() {
a=new Stack<>();
b=new Stack<>();
}
public void appendTail(int value) {
a.push(value);
}
public int deleteHead() {
//只要b不空,那么d从顶到底就是原先a从最早push进的元素
if(!b.isEmpty()){return b.pop();}
//b全被拿出了才会去找a,判断a
if(a.isEmpty()){return -1;}
//由于b排空了,需要从a里面接着转移所有元素到b
while(!a.isEmpty()){b.push(a.pop());}
return b.pop();
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
/*
@v7fgg
执行用时:61 ms, 在所有 Java 提交中击败了57.15%的用户
内存消耗:48.7 MB, 在所有 Java 提交中击败了100.00%的用户
2020年6月30日 10:31
*/
class CQueue {
Deque<Integer> a,b;//LinkedList是Deque类型
public CQueue() {
a=new LinkedList<>();
b=new LinkedList<>();
}
public void appendTail(int value) {
a.add(value);
}
public int deleteHead() {
//只要b不空,那么d从顶到底就是原先a从最早push进的元素
if(!b.isEmpty()){return b.pop();}
//b全被拿出了才会去找a,判断a
if(a.isEmpty()){return -1;}
//由于b排空了,需要从a里面接着转移所有元素到b
while(!a.isEmpty()){b.add(a.pop());}
return b.pop();
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/