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办法须要的工夫和内存
思维二: