每天写一点代码----双队列实现栈
来源:互联网 发布:mysql查询root密码 编辑:程序博客网 时间:2024/05/19 20:21
问题描述:
用两个队列模拟堆栈的操作(入栈与出栈)
思路:
我们知道队列是FIFO(先进先出),而栈是后进先出(LIFO)
要用两个队列实现堆栈我们可以这样做:
假设有A.B两个队列,开始都为空。那么:
入栈操作:
1,当A,B队列均为空时,直接将元素进入A队列。
2,当A,B队列有一个不为空时,将元素入队到不为空的那个队列中。
出栈操作:
1,当A,B 队列均为空时,出栈为Null。
2,当A,B队列有一个不为空时,将不为空的队列(假设为队列B)中的前N-1个元素依次入队到另一个队列(队列A)中,
再将B队列中剩下的最后的一个元素出队并返回之。
Java实现:
import java.util.LinkedList;import java.util.Queue;/** * 双队列实现栈 * * @author likebamboo * @create 2013-10-21 * @param <E> */public class MyStack<E> { /** * 队列A */ private Queue<E> qA; /** * 队列B */ private Queue<E> qB; public MyStack() { super(); qA = new LinkedList<E>(); qB = new LinkedList<E>(); } /** * 入栈操作 * * @param item */ public void push(E item) { // 如果B队列不为空,将元素入B队列 if (!qB.isEmpty()) { qB.offer(item); return; } // 如果两个队列均为空,或者A队列不为空,均将原始加入A队列 qA.offer(item); } /** * 出栈操作 * * @return */ public E pop() { // 如果队列B不为空,那么将B队列中的前N-1个元素出队并进入A队。 // 并将B队列中的最后一个元素出队列并返回。 if (!qB.isEmpty()) { while (qB.size() > 1) { qA.offer(qB.poll()); } return qB.poll(); } // 如果队列B为空,那么不管A队列是否为空(为空时抛出异常也是合理的). // 将A队列中前N-1个元素出队并进入A队列。再返回A队列中的最后一个元素。 while (qA.size() > 1) { qB.offer(qA.poll()); } return qA.poll(); } /** * 栈是否为空 * * @return */ public boolean isEmpty() { return qA.isEmpty() && qB.isEmpty(); } public static void main(String[] args) { MyStack<String> stack = new MyStack<String>(); stack.push("first"); System.out.println(stack.pop()); stack.push("second"); stack.push("third"); stack.push("fourth"); stack.push("fifth"); System.out.println(stack.pop()); System.out.println(stack.pop()); System.out.println(stack.pop()); }}
- 每天写一点代码----双栈实现队列
- 每天写一点代码----双队列实现栈
- 每天写一点代码----计数排序。
- 每天写一点代码----倒水问题(庞果网)
- 每天都写一点
- 每天写一点cocos2dx
- 每天写一点
- 坚持每天写一点jquery代码,慢慢的去理解
- 每天写一点代码----最大子段和问题。
- 每天写一点代码----字符串匹配1(KMP算法)
- 每天写一点代码----完美字符串(庞果网)
- 每天写一点代码----连续子数组乘积最大
- 每天熬夜写代码
- 每天写一点,不爽的时候写一点
- 每天写一点代码----字符串匹配算法 2 (BM算法)
- 每天写一点代码----N个连续数的排序算法(庞果网)
- 打算坚持每天写一点文章
- 从今天开始每天写一点
- C++多线程编程简单实例
- strlen实现
- 海尔回应绞童案:非质量问题赔偿无法启动
- jaxb 给子节点设置属性
- 给UIImageView加上圆角效果
- 每天写一点代码----双队列实现栈
- 欲穷千里目 更上一层楼!
- jarsigner 的使用
- 《Head First设计模式》学习总结
- VS2008中C++打开Excel(MFC)
- 支付宝和天弘独家合作 基金公司淘宝开店热降温
- 主动对象(Active Object):用于并发编程的对象行为模式
- C语言面试之排序专题,一些排序算法的实现
- 各语言注释总结