LC225-用队列实现栈

61 阅读1分钟

题目名称:用队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

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

示例:

输入:
["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 次 pushpoptop 和 empty
  • 每次调用 pop 和 top 都保证栈不为空

思路分析

因为队列是先进的先出,但是栈是后进的先出。因此必须让进队列的元素,排到队首,这样问题就解决了。解决的方法是创建辅助队列,进来的元素先存到辅助队列中,然后将主队列的元素加到辅助元素队列后面,最后再将两个队列交换。

先进先出 的数据结构,要达到后进先出的效果 通过在新添加元素的过程中,将之前加入的元素重新入列 即可做到,后进先出

所以利用两个队列实现栈。每次栈push一个元素的时候,先把元素装进queue2,再把queue1中的每个元素弹出并放入queue2中,最后交换queue1和queue2。ps:每一次栈push都要执行上诉操作。

假设queue1有n个元素,那么每次push,都需要把queue1中的每个元素弹出,再将每个元素放入queue2,所以一共执行2n次操作,同时还有一个新元素加入,所以每次push需要执行2n+1次操作

Code实现

Queue < Integer > queue1;
Queue < Integer > queue2;
public MyStack() {
    queue1 = new LinkedList < > ();
    queue2 = new LinkedList < > ();
}

public void push(int x) {
    queue2.offer(x);
    while (!queue1.isEmpty()) {
        queue2.offer(queue1.poll());
    }
    Queue < Integer > temp = new LinkedList < > ();
    temp = queue2;
    queue2 = queue1;
    queue1 = temp;
}

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

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

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

结果

97ls.png

算法复杂度分析

  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)