算法面试:栈实现队列的方案
声明:码字不易,转载请注明出处,欢迎文章下方讨论交流。
前言: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代码实现,后续会给出其姊妹篇如何用两个队列实现栈?
的问题。
欢迎下方讨论提问,觉得文章对您有用,请收藏点个赞 ^_^
算法面试:栈实现队列的方案相关推荐
- 算法总结——栈与队列
算法总结--栈与队列 一.栈与队列理论基础 用栈实现队列 Python版本 三.用队列实现栈 Python版本 四.有效的括号 Python版本 五.删除字符串中的所有相邻重复项 Python版本 六 ...
- 数据结构与算法(二) 栈与队列(代码示例)
数据结构与算法 栈与队列 1. 数组和链表实现栈 2. 用O(1)的时间复杂度求栈中的最小元素 3. 链表和数组实现队列 4. 用两个栈模拟队列操作 1. 数组和链表实现栈 链表的方式: /*** 描 ...
- 数据结构与算法(2)——栈和队列
前言:题图无关,只是好看,接下来就来复习一下栈和队列的相关知识 前序文章: 数据结构与算法(1)--数组与链表(https://www.jianshu.com/p/7b93b3570875) 栈 什么 ...
- 数据结构与算法--利用栈实现队列
利用栈实现队列 上一节中说明了栈的特点 后进先出,我们用数组的方式实现了栈的基本操作api,因此我们对栈的操作是不考虑排序的,每个api的操作基本都是O(1)的世界,因为不考虑顺序,所以找最大,最小值 ...
- 【数据结构与算法】栈与队列
栈 一.什么是栈? 1.后进者先出,先进者后出,这就是典型的"栈"结构. 2.从栈的操作特性来看,是一种"操作受限"的线性表,只允许在端插入和删除数据. 二.为 ...
- 栈的输出_算法:栈和队列题目集合(一)
前言 栈和队列是算法的一个基本的知识点之一.这篇文章主要介绍三道有关栈和队列的算法题.因为篇幅所限,只介绍push和pop这两种方法的实现 用栈实现队列 用队列实现栈 循环队列的实现 用栈实现队列 入 ...
- 数据结构与算法之栈与队列:java实现
闻理似悟,遇境则迷!!! 栈与队列来说也算是一种特殊的线性表,栈的特点是后进先出,队列的特点是先进先出. 栈 栈的特点是后进先出,栈的操作只有出栈和入栈(也叫压栈),除此之外,还包含栈顶与栈底的指向以 ...
- 算法开启栈转队列武魂
文章目录 ==**栈接口见 [算法开启小码农栈血脉](https://blog.csdn.net/diandengren/article/details/121055584?spm=1001.2014 ...
- 【数据结构与算法】栈与队列【C语言版】
目录 3.1 栈和队列的定义和特点 3.2 栈.队列与一般线性表的区别 3.3 栈的表示和操作的实现 顺序栈与顺序表 ================= 顺序栈的表示 顺序栈初始化 判断顺序栈是否为空 ...
最新文章
- [USACO07NOV]Cow Relays
- 技术雷达峰会2020:从技术趋势看行业挑战
- 数据库多对多设计方案(贴标签的设计方案)
- shell脚本获取客户端IP
- 虚拟鼠标代替安卓触屏_iQOO对比黑鲨2:那个虚拟按键设计更好?
- 菜鸟学Linux 第007篇笔记 简单命令的使用讲解(文本、时间、目录)
- java+解析未知json_在Java中解析JSON时如何忽略未知属性– Jackson @JsonIgnoreProperties注释示例...
- Office web app server2013详细的安装和部署
- [转载]Windowsnbsp;Servernbsp;2008nbsp;R2nbsp;之二十五ADnbsp;RMS信任策略
- Impatient JavaScript 中文版校对活动期待大家的参与
- 开启spring boot学习之旅
- 第6章 循环结构程序设计
- 海信计算机怎么开机,将海信电视连接到计算机的步骤_计算机的基本知识_IT /计算机_信息...
- quartus仿真27:JK触发器构成的同步十进制可逆计数器(分析)
- struts2请求过程源代码分析
- python软件源码下载_【图片】分享一段功能非常简陋的python代码实现下载free种【pt吧】_百度贴吧...
- 离散数学及其应用(英文版 第7版)及答案
- 9080端口对应服务器文件位置,Filenet更改端口-更改9080 端口到 80 端口
- 用Mac安装homebrew的时候报错解决方法
- 为什么阿里 P7 都找不到工作了?