乐趣区

关于leetcode:leetcode-225-Implement-Stack-using-Queues-用队列实现栈简单

一、题目粗心

请你仅应用两个队列实现一个后入先出(LIFO)的栈,并反对一般栈的全副四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true;否则,返回 false。

留神:

你只能应用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
你所应用的语言兴许不反对队列。你能够应用 list(列表)或者 deque(双端队列)来模仿一个队列 , 只有是规范的队列操作即可。

示例:

输出:
[“MyStack”, “push”, “push”, “top”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输入:
[null, null, null, 2, 2, false]

解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

提醒:

  • 1 <= x <= 9
  • 最多调用 100 次 push、pop、top 和 empty
  • 每次调用 pop 和 top 都保障栈不为空

进阶: 你是否仅用一个队列来实现栈。

二、解题思路

应用队列,每次把新退出的数插到前头,这样队列保留的程序和栈的程序是相同的,它们的取出形式也是反的,那么反反得正,就是咱们须要的程序了。我样能够间接对队列 q 操作,在队尾退出了新元素 x 后,将 x 后面所有的元素都安顿好程序取出并加到队列到开端,这样下次就能间接取出 x 了,合乎栈的后入先出的个性,其余三个操作也就是间接调用队列的操作即可。

三、解题办法

3.1 Java 实现

public class MyStack {

    Queue<Integer> q;

    public MyStack() {// int size():获取队列长度;//boolean add(E)/boolean offer(E):增加元素到队尾;//E remove()/E poll():获取队首元素并从队列中删除;//E element()/E peek():获取队首元素但并不从队列中删除。q = new LinkedList<>();}

    public void push(int x) {q.add(x);
        for (int i = 0; i < q.size() - 1; i++) {q.add(q.poll());
        }
    }

    public int pop() {return q.poll();
    }

    public int top() {return q.peek();
    }

    public boolean empty() {return q.isEmpty();
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */

四、总结小记

  • 2022/8/19 天气就像大姑娘的脸呀,说变就变
退出移动版