使用栈实现一个队列,需要弄清楚栈和队列的区别:

栈:先进后出;

队列:先进先出。

实现思路:

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

流程示意图如下:

实现代码:

  1. import java.util.Stack;
  2.  
  3. public class QueueWithStack<T> {
  4. /**
  5. * Test 测试代码
  6. */
  7. public static void main(String[] args) {
  8. QueueWithStack<Integer> queue = new QueueWithStack<>();
  9. queue.add(1);
  10. System.out.println("入队列:1");
  11. queue.add(2);
  12. System.out.println("入队列:2");
  13. queue.add(3);
  14. System.out.println("入队列:3");
  15. queue.add(4);
  16. System.out.println("入队列:4");
  17.  
  18. System.out.println("出队列:" + queue.pop());
  19. System.out.println("出队列:" + queue.pop());
  20.  
  21. queue.add(5);
  22. System.out.println("入队列:5");
  23. queue.add(6);
  24. System.out.println("入队列:6");
  25. System.out.println("====================");
  26. while (false == queue.isEmpty()) {
  27. System.out.println("出队列:" + queue.pop());
  28. }
  29.  
  30. System.out.println("队列内元素个数:" + queue.size());
  31. }
  32.  
  33. // 入栈是,将数据写入该集合,然后在推向pop集合。
  34. private Stack<T> pushStack = null;
  35. // 出站时,读取该集合
  36. private Stack<T> popStack = null;
  37.  
  38. public QueueWithStack() {
  39. pushStack = new Stack<>();
  40. popStack = new Stack<>();
  41. }
  42.  
  43. public boolean isEmpty() {
  44. return popStack.isEmpty();
  45. }
  46.  
  47. public int size() {
  48. return popStack.size();
  49. }
  50.  
  51. public void add(T t) {
  52. while (false == popStack.isEmpty()) {
  53. T val = popStack.pop();
  54. pushStack.push(val);
  55. }
  56.  
  57. pushStack.add(t);
  58.  
  59. while (false == pushStack.isEmpty()) {
  60. T val = pushStack.pop();
  61. popStack.push(val);
  62. }
  63.  
  64. }
  65.  
  66. /**
  67. * 从队列中取出数据,并从队列中移除数据
  68. */
  69. public T pop() {
  70. if (isEmpty()) {
  71. throw new RuntimeException("Queue is empty.");
  72. }
  73. return popStack.pop();
  74. }
  75.  
  76. /**
  77. * 获取栈顶元素,但不会从队列中移除数据
  78. */
  79. public T peek() {
  80. if (isEmpty()) {
  81. throw new RuntimeException("Queue is empty.");
  82. }
  83. return popStack.peek();
  84. }
  85. }

打印结果:

  1. 入队列:1
  2. 入队列:2
  3. 入队列:3
  4. 入队列:4
  5. 出队列:1
  6. 出队列:2
  7. 入队列:5
  8. 入队列:6
  9. ====================
  10. 出队列:3
  11. 出队列:4
  12. 出队列:5
  13. 出队列:6
  14. 队列内元素个数:0

JAVA:使用栈实现一个队列的更多相关文章

  1. java两个栈实现一个队列&&两个队列实现一个栈

    栈:先进后出  队列:先进先出 两个栈实现一个队列: 思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出 源码: class Queue<E&g ...

  2. Python两个栈实现一个队列

    牛客网原题: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.   实现这个算法的方式有很多种,这里就写一种比较简单易懂的:虽然可能算法和效率上不太出色,当大多数人 ...

  3. web前端面试系列 - 数据结构(两个栈模拟一个队列)

    一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将 ...

  4. python两个队列实现一个栈和两个栈实现一个队列

    1.两个栈实现一个队列 两个栈stack1和stack2, push的时候直接push进stack1,pop时需要判断stack1和stack2中的情况.如果stack2不为空的话,直接从stack2 ...

  5. python---两个栈实现一个队列

    class Solution: """两个栈实现一个队列""" def __init__(self): # 接收栈 self.accept_ ...

  6. 剑指offer(五):用两个栈实现一个队列

    题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决办法: 队列先进先出,栈先进后出(stack1和stack2) 其实主要要注意的点是: ①在添加时直接 ...

  7. 两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。

    一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空,则将A栈内容出栈并压人B栈,再出 B栈:不为空就直接出栈: 二.代 ...

  8. 剑指offer:用两个栈实现一个队列

    题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路 用一个栈A来保存入栈,当要出栈的时候,将栈A的元素按照栈后进先出的特点转移到栈B中(此时栈A为空了 ...

  9. 用两个栈实现一个队列(C++)

    分析 栈:后进先出 队列:先进先出 要使用两个栈实现队列(先进先出),主要思路是 1.插入一个元素:直接将元素插入stack1即可. 2.删除一个元素:当stack2不为空时 ,直接弹出栈顶元素,当s ...

随机推荐

  1. oracle 数据库导入导出语句

    oracle的exp/imp命令用于实现对数据库的导出/导入操作;exp命令用于把数据从远程数据库服务器导到本地,生成.dmp文件;imp命令用于把本地的数据库.dmp文件从本地导入到远程的oracl ...

  2. 自动化运维-Ansible-playbook

    Ansible Playbook https://ansible-tran.readthedocs.io/en/latest/docs/playbooks_intro.html Ansible中文网址 ...

  3. MyBatis日记(四):MyBatis——insert、update、delete、select

    MyBatis简单增删改查操作,此处所做操作,皆是在之前创建的MyBatis的Hello world的工程基础上所做操作. 首先在接口文件(personMapper.java)中,添加操作方法: pa ...

  4. Linux命令——whiptail交互式shell脚本对话框

    转自:交互式shell脚本对话框----whiptail指令 当你在linux环境下setup软件的时候就会有相应的对话框让你输入.虽然我们已经习惯了这种交互的方法,但是如果有一种直观的界面来输入是不 ...

  5. win10设置以管理员身份开机启动

    首先是右键程序,然后设置了管理员权限启动.但是在这样设置之后原先的开机机启动就失效了. 在谷歌之后发现有人通过计划任务开机启动.于是就试了试.别人设置的是用户登录时,我改成了开机就启动.就是这样一改, ...

  6. Linux代理服务器使用

    1. 介绍 代理(即网络代理)是一种特殊的网络服务, 允许一个网络终端(客户端)通过这个服务与另一个终端(服务器)进行非直接连接,从而提供服务. 其中, 提供代理的网络终端称为代理服务器(Proxy ...

  7. HTML——MP4视频不能播放

    前言 HTML5中提供了video标签,但是为什么有的MP4视频可以播放,有的不能播放呢? 简介 当然是因为编码的问题咯~ 视频格式 标签属性 DOM参考 HTML 5 视频/音频参考手册 使用 &l ...

  8. npm run build打包时修改的路径

  9. python的readline() 和readlines()

    .readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样..readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python ...

  10. 09-Flutter移动电商实战-移动商城数据请求实战

    1.URL接口管理文件建立 第一步需要在建立一个URL的管理文件,因为课程的接口会一直进行变化,所以单独拿出来会非常方便变化接口.当然工作中的URL管理也是需要这样配置的,以为我们会不断的切换好几个服 ...