如何用栈实现队列
Posted sunyk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用栈实现队列相关的知识,希望对你有一定的参考价值。
about 算法
项目介绍
工作之余,代码敲多了,停下来思考思考,会有异常不到的收获。。。只为更好的自己
如何用栈实现队列?
提示下:用一个栈肯定是没办法实现队列,但如果我们有两个栈呢?
分析:栈和队列的特性
-
栈是先进后出,FILO
出入元素都是在同一端(栈顶)
入栈
1540432924606.png出栈
1540432988027.png -
队列是先进先出,FIFO
-
出入元素是在不同的两端(队头和队尾)
入栈
![1540433080831.png 技术分享图片](https://images.gitee.com/uploads/images/2018/1105/230304_20ed6086_553878.png)
1540433080831.png
出栈
![1540433109205.png 技术分享图片](https://images.gitee.com/uploads/images/2018/1105/230319_776841a5_553878.png)
1540433109205.png
思考:组装
让一个栈作为队列的入口,负责插入新元素;另外一个栈作为队列的出口,负责移除老元素。
如图所示
![1540433258745.png 技术分享图片](https://images.gitee.com/uploads/images/2018/1105/230335_ec0ae815_553878.png)
1540433258745.png
让栈A中的所有元素按顺序出栈,再按照出栈顺序压入栈B。
这样一来,元素从栈A弹出并压入栈B的顺序是3,2,1和当初进入栈A的顺序123是相反的,如图
![1540433561742.png 技术分享图片](https://images.gitee.com/uploads/images/2018/1105/230352_6b638841_553878.png)
1540433561742.png
![1540433605060.png 技术分享图片](https://images.gitee.com/uploads/images/2018/1105/230411_f291c5de_553878.png)
1540433605060.png
此时让元素1 “出队”,也就是让元素1从栈B弹出
![1540433651738.png 技术分享图片](https://images.gitee.com/uploads/images/2018/1105/230428_5f7c10c2_553878.png)
1540433651738.png
代码实现:
/**
* @author sunyang
* @date 2018/10/25 10:18
*/
public class StackImplQueue {
/**
* 定义两个栈来实现队列
* 栈A 负责插入新元素
* 栈B 负责移除老元素
*/
private Stack<Integer> stackA = new Stack<>();
private Stack<Integer> stackB = new Stack<>();
/**
* 入队操作
* @Param element
*/
public void enQueue(int element){
stackA.push(element);
}
/**
*
* 出队操作
*/
public Integer deQueue(){
if (stackB.isEmpty()){
if (stackA.isEmpty()){
return null;
}
fetchFormStackA();
}
return stackB.pop();
}
/**
* 从stackA栈中拿到出栈元素压入栈B
*/
private void fetchFormStackA() {
while (!stackA.isEmpty()){
stackB.push(stackA.pop());
}
}
public static void main(String[] args) {
StackImplQueue stackQueue = new StackImplQueue();
stackQueue.enQueue(1);
stackQueue.enQueue(2);
stackQueue.enQueue(3);
System.out.println(stackQueue.deQueue());
System.out.println(stackQueue.deQueue());
System.out.println(stackQueue.deQueue());
stackQueue.enQueue(4);
System.out.println(stackQueue.deQueue());
}
}
打印结果
![1540435153368.png 技术分享图片](https://images.gitee.com/uploads/images/2018/1105/230450_5665941f_553878.png)
1540435153368.png
题外话:时间复杂度
入栈操作的时间复杂度显然是O(1)
出栈操作的时间复杂度如果发生转移的话就是O(n)
如果没有发生转移的话也是O(1)
以上是关于如何用栈实现队列的主要内容,如果未能解决你的问题,请参考以下文章