算法与数据机构学习_第一章.栈和队列_2.实现2个栈组成的队列
2016-04-15 19:13
459 查看
2个栈组成的队列
===========算法要求:用2个栈实现队列的基本操作(队列的先进先出原则)
思路:栈是先进后出的原则,二队列是先进先出原则。栈的出栈顺序和队列刚好是相反的,因此,可以用2个栈来把顺序反过来,实现先进先出的顺序。
算法过程:定义2个栈,stack1和stack2,可以往stack1中push数据,每次每次加入数据都是往stack1中加入数据,而要peek或pup数据时,从stack2里面取,这样的话,就要实现在pup或peek时,将stack1中的数据压栈到stack2中,此时,stack2中的元素顺序是先进先出的,只要访问stack2的pup和peek方法返回对应的元素即可。
public class QueueFromStack { public static void main(String[] args) { StackQueue<Integer> stackQueue = new StackQueue(); stackQueue.add(1); stackQueue.add(2); stackQueue.add(3); stackQueue.add(4); System.out.println(stackQueue); Integer peek = stackQueue.peek(); System.out.println(peek); Integer pop = stackQueue.pop(); System.out.println(pop); } } class StackQueue<E> { Stack<E> stack1 = new Stack<>(); //存放第一次加入的数据 Stack<E> stack2 = new Stack<>(); //存放移到另一个栈的中数据 public void add(E e) { stack1.push(e); } public E peek() { if (stack1.empty() && stack2.empty()) { //都为空,则数据为空 throw new RuntimeException("stack is empty !"); } else { if (stack2.empty()) { while(!stack1.empty()){ stack2.push(stack1.pop()); } } } return stack2.peek(); } public E pop() { if (stack1.empty() && stack2.empty()) { //都为空,则数据为空 throw new RuntimeException("stack is empty !"); } else { if (stack2.empty()) { while(!stack1.empty()){ stack2.push(stack1.pop()); } } } return stack2.pop(); } }
相关文章推荐
- Cookie实战项目2 记住用户名密码 使用jQuery.Cookie.js 就是这么简单!!!
- 链表
- 欢迎使用CSDN-markdown编辑器
- PowerDesigner 快捷工具栏 palette 不见了,怎么重新打开
- java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
- PHPanywhere在线PHP编辑器
- 固态硬盘使用的优化——适用于任何版本的固态
- hdu 1050 Moving Tables
- 在ubuntu中配置桥接模式(解决每次重启resolv.conf都失效的问题)
- Ubuntu14.04下安装与编译ns-3
- UITableView常见 UI 问题总结
- Android课程---添加黑名单的练习(课堂讲解)
- Linux下添加新硬盘,分区及挂载
- HTTP协议基础(渗透基础:状态码,cookie,session)
- 国内外的几大主流浏览器性能比较
- Android瀑布流照片墙、滑动切换图片
- 感恩和珍惜现在的生活
- &(引用 取址)+指针
- confluence 安装部署
- 《Google重新定义公司》