剑指offer面试题7(java实现):用两个栈实现队列
来源:互联网 发布:像素骑士团合战数据 编辑:程序博客网 时间:2024/06/16 17:24
题目
用两个栈实现一个队列。请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。
思路
先了解一下,栈与队列之间的不同,栈的结构决定它具有“后进先出”的入栈出栈特点,而队列则是有“先进先出”的特点。设想一下,如果对一种数据进行一次入栈操作,紧接着在对第一次入栈的数据进行二次入栈,这样出栈的顺序相对于原数据就可以认为是“先进先出”啦,实现了队列的功能。
通过分析,我们总结一下用两个栈实现队列中的两个方法的思路:
1. 插入元素的方法:
先在两个栈中选择一个作为插入栈(其中的数据是原始数据经过一次入栈),另一个则为删除栈(其中的数据是经过二次入栈操作的,可以认为是队列中的数据),然后在插入栈中插入要插入的元素即可。
2. 删除元素的方法:
相对于插入方法,删除元素的方法要复杂一些。
检测一下删除栈中有没有元素,如果有元素的话则直接删除;如果没有数据,需要将插入栈的数据入栈至此删除栈完成二次入栈动作,达成“先进先出”的效果。
代码实现
public class Queue{ private Stack<String> a;//插入栈 private Stack<String> b;//删除栈 public static void main(String[] args) { uestion007 queue = new Question007(); queue.appendTail("a"); queue.appendTail("b"); queue.appendTail("c"); queue.appendTail("d"); queue.appendTail("e"); while (!queue.isEmpty()) { System.out.println(queue.deleteHead()); } } public Question007() { a = new Stack<String>(); b = new Stack<String>(); } public void appendTail(String string) { a.push(string); } public String deleteHead() { if (b.isEmpty()) { while (!a.isEmpty()) { b.push(a.pop()); } } return b.pop(); } public boolean isEmpty() { return b.isEmpty() && a.isEmpty(); }}
扩展题目
设想一下使用两个队列来实现一个栈的结构。
思路
必须要提的是栈是“后进先出”的结构,而队列是“先进先出”的结构。用两个队列实现一个栈,需要交替使用这两个队列,例如序列为{1,2,3,4},有两个队列a,b.刚开始啊a,b两个队列都是空的,任取一个队列使用,这里选用队列a,将第一个元素插入a,当第二个元素需要插入时,同样需要找一个空的队列,这里只有b,然后将a中的元素移出队列,同时插入b中,这时候b中从头到尾的元素为2,1.接下来第三个元素同样找一个空的队列插入数据,将不空的队列中的元素插入先前找到的空队列。以此类推,每一个过程结束的时候,均有一个空队列(作为下一次插入数据的队列)和一个不空队列(删除数据的队列)。
整个过程如下:
代码实现public class Stack { private Queue<String> a; private Queue<String> b; public Stack () { a = new LinkedList<String>(); b = new LinkedList<String>(); } public void push(String string) { if (a.isEmpty() && b.isEmpty()) { b.offer(string);//这里选用了b队列 } else if (a.isEmpty()) { a.offer(string); while (!b.isEmpty()) { a.offer(b.poll()); } } else { b.offer(string); while (!a.isEmpty()) { b.offer(a.poll()); } } } public String pop() { if (a.isEmpty() && b.isEmpty()) { return null; } else if (!a.isEmpty()) { return a.poll(); } else { return b.poll(); } } public boolean isEmpty() { return a.isEmpty() && b.isEmpty(); }}
- 剑指Offer:面试题7——用两个栈实现队列(java实现)
- 剑指offer面试题7(java实现):用两个栈实现队列
- 剑指offer面试题7:用两个栈实现队列(Java实现)
- 剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈
- 剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈
- 剑指offer-->面试题7 用两个栈实现队列
- 【剑指offer】面试题7:用两个栈实现队列
- 剑指Offer:面试题7 用两个栈实现队列
- 《剑指Offer》面试题7:用两个栈实现队列
- 【剑指offer】 面试题7: 用两个栈实现队列
- 【剑指offer】面试题7:用两个栈实现队列
- 剑指offer-面试题7:用两个栈实现队列
- 剑指offer---面试题7 用两个栈实现队列
- 剑指offer面试题7:用两个栈实现队列
- 剑指Offer面试题7用两个栈实现队列
- 【剑指offer】面试题7:用两个栈实现队列
- 剑指offer面试题7:用两个栈实现队列
- 剑指offer--面试题7: 用两个栈实现队列
- C++中GB2312字符串和UTF-8之间的转换
- Android studio 点击按钮跳转到新的Activity
- C语言结构体struct的语法解析
- 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
- 用WebClient下载媒体文件时报:基础连接已经关闭: 发送时发生错误。
- 剑指offer面试题7(java实现):用两个栈实现队列
- 从汉诺塔到八皇后问题
- Web前端 - babel 使用
- 【可视化】Echarts3 在世界地图中绘制中国各省份的轮廓
- 分布式DB规划要点
- maven依赖关系中Scope的作用
- 数据结构(排序)--插入排序(未优化)
- 排序算法之插入排序
- 自定义控件之viewPager轮播图