关于java:09-用两个栈实现队列

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理