前言
其实 JDK
中有专门实现 FIFO
的类,那么我为什么要写这篇文章呢?
大学时代,刚刚接触 堆
栈
队列
这些概念,时常感觉非常高深…心生畏惧。
其实都是概念定义混淆不清的错!其中有一道编程题印象深刻,如何用栈实现队列?
如果你从不接受挑战,就感受不到胜利的刺激。
思路
栈
:后进先出
是也。
队列
:先进先出
是也。
觉得抽象?那以 数组
举例不太恰当的例子。
如果我在一个 数组
中依次存入1
、2
、3
、4
、5
、6
这几个值。
如果它是 栈
,我们遍历到的是:6
、5
、4
、3
、2
、1
(遍历到的顺序与加入顺序相反)
如果它是 队列
,我们是遍历到:1
、2
、3
、4
、5
、6
(遍历到的顺序与加入顺序相同)
那么,我们怎么用 栈
实现 队列
?
栈
:遍历到的顺序与加入顺序 相反
队列
:遍历到的顺序与加入顺序 相同
经过两次 相反
,不就是 相同
了吗?
栈A(后进先出)拿出放到栈B(先进后出)
= 后进先出 + 先进后出
= 后进后出
//后进后出 不就是 先进先出 吗
搞清楚定义,其实思路就是这么简单…甚至可以说是理所当然。
编码实现
import java.util.Stack;
/**
* StacktoQuenu
* 这里 栈 的实现我直接调用了JDK 的 Stack
* @param <T>
*/
public class StacktoQuenu<T> {
Stack<T> input;
Stack<T> output;
StacktoQuenu(){
input = new Stack<>();
output = new Stack<>();
}
public void push(T t){
input.push(t);
}
public T pop(){
if(output.empty()){
mobile();
}
return output.pop();
}
private void mobile(){
while(!input.empty()){
output.push(input.pop());
}
}
}
测试调用
/**
* Main
*/
public class Main {
static StacktoQuenu quenu;
public static void main(final String[] args) {
quenu = new StacktoQuenu();
quenu.push(1);
quenu.push(2);
quenu.push(3);
for (int i = 0; i < 3; i++) {
System.out.println(quenu.pop());
}
quenu.push(4);
quenu.push(5);
quenu.push(6);
for (int i = 0; i < 3; i++) {
System.out.println(quenu.pop());
}
}
}
测试结果