使用栈实现一个队列,需要弄清楚栈和队列的区别:
栈:先进后出;
队列:先进先出。
实现思路:
1)通过两个栈(pushStack / popStack)对倒,确保 popStack 栈的出栈顺序与队列出列一致。
2)核心难点在加入队列操作,假设队列中已经加入1、2、3、4,加入5的过程:
2.1)假设已经加入1/2/3/4
2.2)把popStack中的数据导入pushStack
2.3)pushStack加入5
2.4)把pushStack中的数据导入popStack
流程示意图如下:
实现代码:
import java.util.Stack; public class QueueWithStack<T> { /** * Test 测试代码 */ public static void main(String[] args) { QueueWithStack<Integer> queue = new QueueWithStack<>(); queue.add(1); System.out.println("入队列:1"); queue.add(2); System.out.println("入队列:2"); queue.add(3); System.out.println("入队列:3"); queue.add(4); System.out.println("入队列:4"); System.out.println("出队列:" + queue.pop()); System.out.println("出队列:" + queue.pop()); queue.add(5); System.out.println("入队列:5"); queue.add(6); System.out.println("入队列:6"); System.out.println("===================="); while (false == queue.isEmpty()) { System.out.println("出队列:" + queue.pop()); } System.out.println("队列内元素个数:" + queue.size()); } // 入栈是,将数据写入该集合,然后在推向pop集合。 private Stack<T> pushStack = null; // 出站时,读取该集合 private Stack<T> popStack = null; public QueueWithStack() { pushStack = new Stack<>(); popStack = new Stack<>(); } public boolean isEmpty() { return popStack.isEmpty(); } public int size() { return popStack.size(); } public void add(T t) { while (false == popStack.isEmpty()) { T val = popStack.pop(); pushStack.push(val); } pushStack.add(t); while (false == pushStack.isEmpty()) { T val = pushStack.pop(); popStack.push(val); } } /** * 从队列中取出数据,并从队列中移除数据 */ public T pop() { if (isEmpty()) { throw new RuntimeException("Queue is empty."); } return popStack.pop(); } /** * 获取栈顶元素,但不会从队列中移除数据 */ public T peek() { if (isEmpty()) { throw new RuntimeException("Queue is empty."); } return popStack.peek(); } }
打印结果:
入队列:1 入队列:2 入队列:3 入队列:4 出队列:1 出队列:2 入队列:5 入队列:6 ==================== 出队列:3 出队列:4 出队列:5 出队列:6 队列内元素个数:0
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/124568.html