09. 用两个栈实现队列
解释题目:
补充知识:
Deque接口 读作deck
public interface Deque<E> extends Queue<E>
1、Deque的实现类有LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。
2、支持在两端插入和移除元素、检查元素
3、普通队列(一端进另一端出)、双端队列(两端都可以进出)、堆栈的构造都能用以下方法:Deque deque = new LinkedList()
用Deque接口代替Queue接口的方法:
用Deque接口代替Stack类的方法:摘自Java双端队列Deque使用详解
4、Deque接口也有push pop方法。- LinkedList类
1、可以索引、可以重复
2、有序:存储和取出的顺序一致
List、List特有方法、并发修改异常、ListIterator接口、LinkedList
思路:
题目规定了用双栈,且给了CQueue的类来实现
class CQueue {
public CQueue() {
}
public void appendTail(int value) {
}
public int deleteHead() {
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
public CQueue():创建对象,需要把两个栈声明为CQueue类的全局变量。
public void appendTail(int value):直接push到栈1
public int deleteHead():目前栈1就是所有元素,再pop到栈2,那么栈2再pop就是头元素。(如果栈2没有元素,才能pop到栈2,否则顺序不对)
public CQueue()的注意点:
创建对象,且对象是全局的,所以要在全局声明,再在构造函数中创建。
class CQueue {
private Deque<Integer> sta1;
private Deque<Integer> sta2;
public CQueue() {
sta1 = new LinkedList<>();
sta2 = new LinkedList<>();
}
public int deleteHead()的重要思想一:
如果栈2不空,那么栈2第一个元素就是头元素
如果栈2空,栈1空,那么返回-1
如果栈2孔,栈1不空,那么遍历栈1pop到栈2,栈2第一个元素就是头元素。
public int deleteHead()的重要思想二:
如果栈2空,栈1不空,那么遍历栈1pop到栈2,栈2第一个元素就是头元素。
如果栈2空,栈1空,那么返回-1。
栈2不空的情况直接return removeLast(),与第一种情况合并。
操作:
思想一:更具备逻辑性
用Deque和addLast removeLast方法需要的运行时间短,内存小于用Stack和push pop方法需要的时间和内存
思想二:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。