一、题目粗心

请你仅应用两个队列实现一个后入先出(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 天气就像大姑娘的脸呀,说变就变