题目链接:
https://leetcode-cn.com/problems/implement-stack-using-queues/
题目描述:
使用队列实现栈的下列操作:
push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空
注意:
你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。 你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。 你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。
基本思路;
入栈:把新的元素往 A 队列中入队即可
出栈: 把 A 队列中的元素往 B中倒腾,当A中只剩一个元素的时候,就把最后的元素直接出队列即可,然后交换 A 和B的身份,保证新入栈的元素始终是往 A 中入。
取栈顶元素:和 出栈 类似。
判定为空: A和B都为空。
代码实现:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
public class MyStackBy2Queue {
private Queue<Integer> A = new LinkedList<>();
private Queue<Integer> B = new LinkedList<>();
public void push(int x) {
// x 往 A 中入队列即可
A.offer(x);
}
public Integer pop() {
if (empty()) {
return null;
}
// 把 A 中的元素往 B 中倒腾
while (A.size() > 1) {
Integer front = A.poll();
B.offer(front);
}
// 当循环结束之后, A 中应该就是 1 个元素;
// 这个元素就应该是被出栈的元素
int ret = A.poll();
// 交换 A 和 B 的身份
swapAB();
return ret;
}
private void swapAB() {
Queue<Integer> tmp = A;
A = B;
B = tmp;
}
public Integer top() {
if (empty()) {
return null;
}
// 把 A 中的元素往 B 中倒腾
while (A.size() > 1) {
Integer front = A.poll();
B.offer(front);
}
// 当循环结束之后, A 中应该就是 1 个元素;
// 这个元素就应该是被出栈的元素
int ret = A.poll();
B.offer(ret); // top 和 pop 唯一的区别就是这句话
// 交换 A 和 B 的身份
swapAB();
return ret;
}
public boolean empty() {
return A.isEmpty() && B.isEmpty();
}
}