使用栈Stack实现队列Queue
2014-09-26 15:58
447 查看
如何只使用stack实现queue呢?由于stack是现进后出(FILO),而queue是先进先出的(FIFO)。也就是说stack进行了一次反向,进行两次反向就能实现queue的功能,所以可以用两个stack实现queue。
假设两个栈inStack和outStack,且都为空。可以认为onStack提供入队的功能,栈outStack提供出队的功能。下面是入队和出队的具体算法:
(1)如果栈outStack不为空,直接弹出栈outStack顶部的数据;
(2)如果栈outStack为空,则依次弹出栈inStack的数据,放入栈outStack中,再弹出栈outStack顶部的数据;
实现的代码:
测试代码:
输出:
假设两个栈inStack和outStack,且都为空。可以认为onStack提供入队的功能,栈outStack提供出队的功能。下面是入队和出队的具体算法:
(1)如果栈outStack不为空,直接弹出栈outStack顶部的数据;
(2)如果栈outStack为空,则依次弹出栈inStack的数据,放入栈outStack中,再弹出栈outStack顶部的数据;
实现的代码:
/** * 使用两个栈来模拟队列 * * @param <T> * */ public class SimulationQueue<T> { private Stack<T> inStack; private Stack<T> outStack; public SimulationQueue() { inStack = new Stack<T>(); outStack = new Stack<T>(); } /** * 入队 * * @param t */ public void enqueue(T t) { inStack.push(t); } /** * 出队 */ public T dequeue() { T temp = null; if (!outStack.isEmpty()) { temp = outStack.pop(); } else { while (!inStack.isEmpty()) { temp = inStack.pop(); outStack.push(temp); } if (!outStack.isEmpty()) { temp = outStack.pop(); } } return temp; } /** * 队列是否为空 * * @return */ public boolean isEmpty() { return inStack.isEmpty() && outStack.isEmpty(); } /** * 清空队列 */ public void clear() { inStack.clear(); outStack.clear(); } }
测试代码:
public static void main(String[] args) { SimulationQueue<String> queue = new SimulationQueue<String>(); queue.enqueue("a"); queue.enqueue("b"); queue.enqueue("c"); queue.enqueue("d"); while(!queue.isEmpty()){ System.out.println("当前出队元素:"+queue.dequeue()); } }
输出:
相关文章推荐
- 面试题---使用栈stack实现队列queue
- 使用C#的泛型队列Queue实现生产消费模式
- java中使用FIFO队列:java.util.Queue实现多台服务器发邮件的代码
- c#常用集合类使用练习(队列Queue、栈Stack、哈希表Hashtable和动态数组ArrayList)(4):
- java集合框架:浅谈如何使用LInkedList实现队列(Queue)和堆栈(Stack)
- 利用栈Stack实现队列(Queue)
- 循环队列Queue–使用链式存储结构实现
- 使用bsd的queue.h实现简单队列
- c#常用集合类使用练习(队列Queue、栈Stack、哈希表Hashtable和动态数组ArrayList)(1):
- LeetCode OJ 之 Implement Queue using Stacks(使用栈实现队列)
- Java实现栈Stack和队列Queue
- 使用 MySQL 实现无锁任务队列(using MySQL as a job queue)
- 使用两个栈(stack)实现一个队列(queue)
- java实现数据结构——栈Stack与队列Queue
- 用结点实现链表LinkedList,用数组和结点实现栈Stack,用数组和结点链表实现队列Queue
- 【java笔试系列四】Java实现栈Stack和队列Queue
- 【java笔试系列四】Java实现栈Stack和队列Queue
- Ruby中使用多线程队列(Queue)实现下载博客文章保存到本地文件
- cpp: 使用类模板以及链表实现队列Queue
- c#常用集合类使用练习(队列Queue、栈Stack、哈希表Hashtable和动态数组ArrayList)(3):