2个队列实现一个栈
2016-05-19 00:47
405 查看
在算法导论有一道非常有趣的证明题, 利用2个队列实现一个栈, 队列和栈最大的区别就是队列满足FIFO(先进先出),他有2个操作的地方,一个是队头一个是队尾,
而栈满足的是先进后出,他只有一个操作的地方就是栈顶。
我们定义2个队列
queue1 queue2 用于存放进"栈" 用queue2临时存
放queue1的数据。
那么实现他的方式就比较明显了, 首先我们先抽象的想象一下,我们封住队列的一个一端,元素进“栈”的话,直接让他进去queue1队列
对于出“栈”,把queue1的除开最后一个元素的其余的元素转移到queue2中
,然后把刚才剩下queue1中的那个元素出队列(Stack.pop)。之后把q2中的全部元素转移回q1中。
比如queue1中有三个数据c b a. 那么我们把除开最后一个c以外的2个元素 b, a元素移到queue2. 如果这个时候用户出栈的话,
那么请问是不是就只有c了? c就是栈顶。 c pop出去, 接着如果在执行出栈的话,我们在把queue2中除最后一个元素的元素
移到queue1 请问是不是只有b了? 那么执行pop就是出去b。
下面给出Java实现代码:
而栈满足的是先进后出,他只有一个操作的地方就是栈顶。
我们定义2个队列
queue1 queue2 用于存放进"栈" 用queue2临时存
放queue1的数据。
那么实现他的方式就比较明显了, 首先我们先抽象的想象一下,我们封住队列的一个一端,元素进“栈”的话,直接让他进去queue1队列
对于出“栈”,把queue1的除开最后一个元素的其余的元素转移到queue2中
,然后把刚才剩下queue1中的那个元素出队列(Stack.pop)。之后把q2中的全部元素转移回q1中。
比如queue1中有三个数据c b a. 那么我们把除开最后一个c以外的2个元素 b, a元素移到queue2. 如果这个时候用户出栈的话,
那么请问是不是就只有c了? c就是栈顶。 c pop出去, 接着如果在执行出栈的话,我们在把queue2中除最后一个元素的元素
移到queue1 请问是不是只有b了? 那么执行pop就是出去b。
下面给出Java实现代码:
import java.util.Queue; public class Test_Queue { Queue<integer> queue1 = new ArrayDeque<>(); Queue<integer> queue2 = new ArrayDeque<>(); public void push(int node) { //两个栈都为空时,优先考虑queue1 if (queue1.isEmpty()&&queue2.isEmpty()) { queue1.add(node); return; } //如果queue1为空,queue2有元素,直接放入queue2 if (queue1.isEmpty()) { queue2.add(node); return; } if (queue2.isEmpty()) { queue1.add(node); return; } } public int pop() { //两个栈都为空时,没有元素可以弹出 if (queue1.isEmpty()&&queue2.isEmpty()) { try { throw new Exception(stack is empty); } catch (Exception e) { } } //如果queue1为空,queue2有元素, 将queue2的元素依次放入queue1中,直到最后一个元素,我们弹出。 if (queue1.isEmpty()) { while (queue2.size()>1) { queue1.add(queue2.poll()); } return queue2.poll(); } if (queue2.isEmpty()) { while (queue1.size()>1) { queue2.add(queue1.poll()); } return queue1.poll(); } return (Integer) null; } public static void main(String[] args) { Test_Queue test_Queue = new Test_Queue (); test_Queue.push(9); test_Queue.push(8); test_Queue.push(7); test_Queue.push(6); System.out.println(test_Queue.pop()); System.out.println(test_Queue.pop()); demo08.push(5); System.out.println(test_Queue.pop()); System.out.println(test_Queue.pop()); System.out.println(dtest_Queue.pop()); }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树