09. 用两个栈实现队列

image.png
解释题目:
image.png

补充知识:

  • Deque接口 读作deck
    image.png

    public interface Deque<E> extends Queue<E>

    1、Deque的实现类有LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。
    2、支持在两端插入和移除元素、检查元素
    3、普通队列(一端进另一端出)、双端队列(两端都可以进出)、堆栈的构造都能用以下方法:

    Deque deque = new LinkedList()

    用Deque接口代替Queue接口的方法:
    image.png
    用Deque接口代替Stack类的方法:
    image.png

    摘自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(),与第一种情况合并。

操作:

思想一:更具备逻辑性
image.png
用Deque和addLast removeLast方法需要的运行时间短,内存小于用Stack和push pop方法需要的时间和内存
思想二:
image.png


MeeWoW
18 声望1 粉丝

加油