声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。

前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本篇文章介绍一个有趣的问题:用两个栈实现一个队列。这道题来自互联网公司的算法面试,作为一道经典的算法面试题,本文给出问题的解决思路和Java实现代码。

前两篇文章介绍了栈(stack)和队列(queue)两种特殊的数据结构和他们特点,栈和队列虽然是特点针锋相对的,但有意思的是他们却彼此相互联系。

后进先出的栈如何才能实现先进先出的队列呢?一般会用两个栈来实现。首先定义两个栈分别为stack1和stack2.

1.解决方案一:

我们让入队的操作在stack1中完成,出队的操作在stack2中完成,具体分析过程如下:

  • 入队: ①将所有元素直接向stack1中压栈
  • 出队: ②将stack1中的所有元素依次出栈,③紧接着入栈到stack2中,④然后弹出stack2中的元素。

为清楚说明,用下图解释:

来回入队、出队比较麻烦,尤其是出队比较麻烦,需要先将元素从stack1倒入stack2中,然后stack2弹出的元素又倒回到stack1中。有没有更优化的方案呢?以下方案2是改进之后的思路。

2.解决方案二:

入队都在stack1中进行,stack2用于队列,同时保证所有元素都在一个栈里,且遵循以下约束:

  • 入队:不管stack1空与否,都将stack2中的所有元素压入stack1中
  • 出队:若stack2中不为空,则直接从stack2中弹出元素;若stack2为空,则说明队列为空,不能出队。

方案2与方案1的区别在于,方案2中把倒回的操作放在了入队中完成,使连续入队、出队的效率提高。有没有更优化的方案呢?以下对方案2改进,给出方案3.

3.解决方案三:

入队都在stack1中完成,出队都在stack2中完成,且遵循以下约束:

  • 入队:直接把元素压入stack1中;
  • 出队:若stack2中不为空,则直接弹出stack2中的元素;若stack2中为空,则将stack1中的所有元素倒入stack2中,然后弹出stack2的栈顶元素。同样,若两个栈都为空,则队列为空队,无法出队。

方案3的特点是:入队时非常简单,而在出队时,多数情况下可以直接通过弹出stack2完成。如果把stack1中的元素倒入stack2中,则一般不用每次都进行这样的操作。最坏的情况就是出队一个元素、入队一个元素这样的循环,导致每次出队都需要转移元素。

4.java代码实现

以下给出方案3的代码实现:

public class Stacks2Queue {private Stack stack1;private Stack stack2;private int maxLength;public Stacks2Queue(int capacity){maxLength = capacity;stack1 = new Stack(capacity);        stack2 = new Stack(capacity);        }/*** 队列入队* @param element 入队元素* @return 入队成功?*/public boolean put(int element){if(stack1.isFull() || maxLength == stack1.getSize()){//此时stack1满return false;}stack1.push(element);return true;}/*** 队列出队* @return 出队的元素*/public int poll(){if(!stack2.isEmpty()){return stack2.pop();}else{while(!stack1.isEmpty()){stack2.push(stack1.pop());}return stack2.pop();}}/*** 求队列长度* @return 返回队列长度*/public int getSize(){return stack1.getSize()+stack2.getSize();}
}

测试代码如下:

public class Stack2QueueTest {public static void main(String[] args) {Stacks2Queue q = new Stacks2Queue(5);q.put(1);   //入队元素 1q.put(2);   //入队元素 2System.out.println("出队的元素为"+q.poll());   //出队元素   打印1System.out.println("此时队列长度为"+q.getSize());  //返回1q.put(3);   //入队元素 3q.put(4);   //入队元素 4System.out.println("出队的元素为"+q.poll());   //出队元素  打印2System.out.println("出队的元素为"+q.poll());   //出队元素  打印3 本次出队操作会把3和4两个元素从stack1中倒入stack2中}
}

注:以上代码用到了堆和栈的代码,请移步到前两篇文章获取Java数据结构与算法——栈(stack)和Java数据结构与算法——队列(queue)

5.小结:

本文介绍了一个互联网面试经典问题如何用两个栈实现队列?并给出解决思路和java代码实现,后续会给出其姊妹篇如何用两个队列实现栈?的问题。

欢迎下方讨论提问,觉得文章对您有用,请收藏点个赞 ^_^

算法面试:栈实现队列的方案相关推荐

  1. 算法总结——栈与队列

    算法总结--栈与队列 一.栈与队列理论基础 用栈实现队列 Python版本 三.用队列实现栈 Python版本 四.有效的括号 Python版本 五.删除字符串中的所有相邻重复项 Python版本 六 ...

  2. 数据结构与算法(二) 栈与队列(代码示例)

    数据结构与算法 栈与队列 1. 数组和链表实现栈 2. 用O(1)的时间复杂度求栈中的最小元素 3. 链表和数组实现队列 4. 用两个栈模拟队列操作 1. 数组和链表实现栈 链表的方式: /*** 描 ...

  3. 数据结构与算法(2)——栈和队列

    前言:题图无关,只是好看,接下来就来复习一下栈和队列的相关知识 前序文章: 数据结构与算法(1)--数组与链表(https://www.jianshu.com/p/7b93b3570875) 栈 什么 ...

  4. 数据结构与算法--利用栈实现队列

    利用栈实现队列 上一节中说明了栈的特点 后进先出,我们用数组的方式实现了栈的基本操作api,因此我们对栈的操作是不考虑排序的,每个api的操作基本都是O(1)的世界,因为不考虑顺序,所以找最大,最小值 ...

  5. 【数据结构与算法】栈与队列

    栈 一.什么是栈? 1.后进者先出,先进者后出,这就是典型的"栈"结构. 2.从栈的操作特性来看,是一种"操作受限"的线性表,只允许在端插入和删除数据. 二.为 ...

  6. 栈的输出_算法:栈和队列题目集合(一)

    前言 栈和队列是算法的一个基本的知识点之一.这篇文章主要介绍三道有关栈和队列的算法题.因为篇幅所限,只介绍push和pop这两种方法的实现 用栈实现队列 用队列实现栈 循环队列的实现 用栈实现队列 入 ...

  7. 数据结构与算法之栈与队列:java实现

    闻理似悟,遇境则迷!!! 栈与队列来说也算是一种特殊的线性表,栈的特点是后进先出,队列的特点是先进先出. 栈 栈的特点是后进先出,栈的操作只有出栈和入栈(也叫压栈),除此之外,还包含栈顶与栈底的指向以 ...

  8. 算法开启栈转队列武魂

    文章目录 ==**栈接口见 [算法开启小码农栈血脉](https://blog.csdn.net/diandengren/article/details/121055584?spm=1001.2014 ...

  9. 【数据结构与算法】栈与队列【C语言版】

    目录 3.1 栈和队列的定义和特点 3.2 栈.队列与一般线性表的区别 3.3 栈的表示和操作的实现 顺序栈与顺序表 ================= 顺序栈的表示 顺序栈初始化 判断顺序栈是否为空 ...

最新文章

  1. [USACO07NOV]Cow Relays
  2. 技术雷达峰会2020:从技术趋势看行业挑战
  3. 数据库多对多设计方案(贴标签的设计方案)
  4. shell脚本获取客户端IP
  5. 虚拟鼠标代替安卓触屏_iQOO对比黑鲨2:那个虚拟按键设计更好?
  6. 菜鸟学Linux 第007篇笔记 简单命令的使用讲解(文本、时间、目录)
  7. java+解析未知json_在Java中解析JSON时如何忽略未知属性– Jackson @JsonIgnoreProperties注释示例...
  8. Office web app server2013详细的安装和部署
  9. [转载]Windowsnbsp;Servernbsp;2008nbsp;R2nbsp;之二十五ADnbsp;RMS信任策略
  10. Impatient JavaScript 中文版校对活动期待大家的参与
  11. 开启spring boot学习之旅
  12. 第6章 循环结构程序设计
  13. 海信计算机怎么开机,将海信电视连接到计算机的步骤_计算机的基本知识_IT /计算机_信息...
  14. quartus仿真27:JK触发器构成的同步十进制可逆计数器(分析)
  15. struts2请求过程源代码分析
  16. python软件源码下载_【图片】分享一段功能非常简陋的python代码实现下载free种【pt吧】_百度贴吧...
  17. 离散数学及其应用(英文版 第7版)及答案
  18. 9080端口对应服务器文件位置,Filenet更改端口-更改9080 端口到 80 端口
  19. 用Mac安装homebrew的时候报错解决方法
  20. 为什么阿里 P7 都找不到工作了?

热门文章

  1. vue动态生成表单元素
  2. 中国网建SMS短信接口调用(java发送短信)
  3. 自定义SpringBoot start 被依赖时 程序包不存在的问题
  4. 常用JavaScript的高级技巧
  5. 1.8(学习笔记)监听器(Listener)
  6. zabbix部署-版本3.2.6
  7. 闭包总结(2018.03.19)
  8. Selenium基础知识
  9. haproxy代理hive
  10. 成都Uber优步司机奖励政策(3月9日)