博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
两个队列实现一个栈 + 两个栈实现一个队列 Java
阅读量:4163 次
发布时间:2019-05-26

本文共 2614 字,大约阅读时间需要 8 分钟。

面试中常出现让你手写两个队列实现一个栈,两个栈实现一个队列的问题,很是头疼!今天就仔细将我分析,思考过的Java代码给大家分享一下:

(一)两个队列实现一个栈:

两个队列添加元素,哪个队列为空,由于在输出元素时,要进行相应元素的移动(除去尾部元素),所以要在对应不为空的队列进行元素的添加;在输出数据时,要进行两个队列的变相操作,不为空的队列要依次向为空的队列中添加元素,直到尾元素输出即可!

/** *  * @author superYC * 两个队列实现一个栈 * */public class TwoQueueImplStack {	Queue
queue1 = new ArrayDeque
(); Queue
queue2 = new ArrayDeque
(); /* * 向栈中压入数据 */ public void push(Integer element){ //两个队列都为空时,优先考虑 queue1 if(queue1.isEmpty() && queue2.isEmpty()){ queue1.add(element); return; } //如果queue1为空,queue2有数据,直接放入queue2 if(queue1.isEmpty()){ queue2.add(element); return; } //如果queue2为空,queue1有数据,直接放入queue1中 if(queue2.isEmpty()){ queue1.add(element); return; } } /* * 从栈中弹出一个数据 */ public Integer pop(){ //如果两个栈都为空,则没有元素可以弹出,异常 if(queue1.isEmpty() && queue2.isEmpty()){ try{ throw new Exception("satck is empty!"); }catch(Exception e){ e.printStackTrace(); } } //如果queue1中没有元素,queue2中有元素,将其queue2中的元素依次放入queue1中,直到最后一个元素,弹出即可 if(queue1.isEmpty()){ while(queue2.size() > 1){ queue1.add(queue2.poll()); } return queue2.poll(); } //如果queue2中没有元素,queue1中有元素,将其queue1中的元素依次放入queue2中,直到最后一个元素,弹出即可 if(queue2.isEmpty()){ while(queue1.size() > 1){ queue2.add(queue1.poll()); } return queue1.poll(); } return (Integer)null; } public static void main(String[] args) { TwoQueueImplStack qs = new TwoQueueImplStack(); qs.push(2); qs.push(4); qs.push(7); qs.push(5); System.out.println(qs.pop()); System.out.println(qs.pop()); qs.push(1); System.out.println(qs.pop()); }}

(二)两个栈实现一个队列:

第一个栈只负责添加元素,第二个栈在弹出元素时,首先判断当前栈是否为空,若为空就直接将其第一个栈中的数据全部压入第二个栈中,然后输出栈顶元素,即可实现队列效果;若第二个栈中有数据,添加直接将其数据压入第一个栈中,输出时直接输出第二个栈顶的元素即可!

/** *  * @author superYC * 两个栈实现一个队列 *  */public class TwoStackImplQueue {	Stack
stack1 = new Stack
(); Stack
stack2 = new Stack
(); /* * 队列的数据压入过程 */ public void push(Integer element){ stack1.push(element); } /* * 队列的数据弹出过程 */ public Integer pop(){ if(stack2.size() <= 0){ //第二个栈为空 while(stack1.size() > 0){ //第一个栈不为空 stack2.push(stack1.pop()); //将其第一个栈的数据压入第二个栈中 } } if(stack2.isEmpty()){ try{ throw new Exception("queue is empty"); }catch(Exception e){ //e.printStackTrace(); } } Integer head = stack2.pop(); return head; } public static void main(String[] args) { TwoStackImplQueue sq = new TwoStackImplQueue(); sq.push(1); sq.push(3); sq.push(5); sq.push(4); sq.push(2); System.out.println(sq.pop()); System.out.println(sq.pop()); sq.push(7); System.out.println(sq.pop()); }}

你可能感兴趣的文章
ms精度定时器
查看>>
Qt之QStackedWidget
查看>>
Qt中设置窗体固定大小的方法
查看>>
qt 单例模式
查看>>
Qt之QThreadPool和QRunnable
查看>>
Qt之QEvent
查看>>
qt中 accept()和ignore()函数
查看>>
windbg 常用命令~*
查看>>
C++调用方式 入栈顺序
查看>>
windbg 常用查看锁以及互斥量
查看>>
dumpbin的使用
查看>>
VS下的常用快捷键
查看>>
常用的寄存器(& bss段的作用)
查看>>
简单的D3d使用(通过surface)
查看>>
qt 获取窗口句柄
查看>>
Qt拖放 drag and drop
查看>>
Qt之设置QWidget背景色
查看>>
QMiniData
查看>>
qt利用QSplitter任意拆分窗口
查看>>
Qt之系统托盘(QSystemTrayIcon详解)
查看>>