【Leetcode】225.用队列实现栈

225 用队列实现栈

注意: 队列的基本操作为add和poll和isEmpty,栈的基本操作为push和pop和empty

思路:

  • 准备两个队列,一个queue队列一个help队列

  • 执行push操作时,只向queue队列中add元素

  • 执行pop操作时,将queue中元素弹入help中,只剩下一个需要弹出的元素,将queue中剩下的这一个元素保存后弹出。 最后,将help和queue互换,因为此时queue已弹空,原来queue元素均导入到help中。为了实现任何入列都是入到queue中,因此需将两个队列互换

  • 执行peek操作时,与pop操作大体相同。只是peek并未真要弹出栈顶元素,只是取出而已。所以需要将这个元素也加进help中。最终的效果相当于把queue中元素均加入到help中,再将help与queue互换

  • queue队列为空栈即为空

  • *代码:**

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    class MyStack {

    Queue<Integer> queue1;
    Queue<Integer> help;

    /** Initialize your data structure here. */
    public MyStack() {
    queue1 = new LinkedList<>();
    help = new LinkedList<>();
    }

    public void push(int x) {
    //只向队列queue中push元素
    queue1.add(x);
    }

    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
    //将queue中元素弹入help中,只剩下一个需要弹出的元素
    while(queue1.size() != 1)
    help.add(queue1.poll());
    //将queue中剩下的这一个元素保存后弹出
    int res = queue1.poll();
    //将help和queue互换
    //因为此时queue已弹空,原来queue元素均导入到help中。
    //为了实现任何入列都是入到queue中,因此需将两个队列互换
    swap();
    return res;
    }

    /** Get the top element. */
    //取队顶元素的peek操作大体与pop相同,只是peek并未真要弹出栈顶元素,只是取出而已
    //所以需要将这个元素也加进help中。最终的效果相当于把queue中元素均加入到help中,再将help与queue互换
    public int top() {
    while(queue1.size() != 1)
    help.add(queue1.poll());
    int res = queue1.poll();
    help.add(res);
    swap();
    return res;
    }

    /** Returns whether the stack is empty. */
    public boolean empty() {
    return queue1.isEmpty();
    }

    private void swap() {
    Queue<Integer> tmp = help;
    help = queue1;
    queue1 = tmp;
    }
    }