一、题目
如何仅用队列结构实现栈结构?
二、实现思路
定义两个队列,Data 和 Help。
压栈:只要有新数据,就压入 Data 队列。
出栈:
- 如果 Data 队列为空。报错。
- 如果 Data 队列中的元素数量大于 1,就将Data 队列中的数据倒入 Help 队列,直到 Data 队列只剩一个数据。
- 将 Data 队列剩下的数据出队并作为返回值返回,Data 和 Help 交换指向的队列(也就是说Data指向原来的 Help 指向的队列,Help 指向原来 Data 指向的队列)。
返回栈顶:
除了出栈操作中的第三步,将 Data 队列剩下的数据出队并放入 Help 队列而且作为返回值返回,其余与出栈操作相同。
三、代码实现(Java)
import java.util.LinkedList;
import java.util.Queue;
public class Queue_To_Stack {
public static class QueueToSatck {
private Queue<Integer> queueData;
private Queue<Integer> queueHelp;
// 初始化栈
public QueueToSatck() {
queueData = new LinkedList<>();
queueHelp = new LinkedList<>();
}
// 压栈
public void push(int obj) {
queueData.add(obj);
}
// 出栈
public int pop() {
// Data 队列为空,报错
if (queueData.isEmpty())
throw new Error("The stack is empty!");
// Data 队列中的元素数量大于 1,将Data队列中的数倒入 Help 队列
while (queueData.size() > 1) {
queueHelp.add(queueData.poll());
}
// Data队列出队,并将值存入 res 中
int res = queueData.poll();
// 交换 Data 和 Help 的指向
swap();
return res;
}
// 返回栈顶
public int peek() {
// Data 队列为空,报错
if (queueData.isEmpty())
throw new Error("The stack is empty!");
// Data 队列中的元素数量大于 1,将Data队列中的数倒入 Help 队列
while (queueData.size() != 1) {
queueHelp.add(queueData.poll());
}
// Data 队列出队,并将值存入 res 中
int res = queueData.poll();
// 将 res 中的值存入 Help 队列中
queueHelp.add(res);
// 交换 Data 和 Help 的指向
swap();
return res;
}
private void swap() {
Queue<Integer> tmp = queueData;
queueData = queueHelp;
queueHelp = tmp;
}
}