当前位置: 首页 > news >正文

如何两个栈实现队列?两个队列实现栈?

初看此题目,你可能觉得自找苦吃,队列就队列为什么要用栈来实现,工程中总是很典型的应用,直接调API就可以了,不管是什么语言,已经有现成API封装好队列以及堆栈的所有操作。没错,在项目中很少有这样的需要。但是我们是站在学习的角度,并不是画地为牢,难为自己,而是对思维的一种锻炼,对算法的提升么。我们在面试的时候碰到的这类问题还少吗?所以大家就不要拍砖了。现在开始研究此问题。

首先看如何用两个栈去实现一个队列,栈所具有的操作主要是push和pop。也就是面对一个桶,只能在顶上拿元素或放元素,别的地方都是封闭的。而一个队列所具有的特性是offer(尾部入队)和poll(队首出队)。相当于一个两端开口的桶,一端只能放,一端只能取。

而如何将一个只有一端操作的变成两端操作的呢,其实就是用两个一端操作的。就可以完成一个两端操作的。用栈1来专门处理offer(入队操作,在队尾),用栈2来处理poll(出队操作,在队首)。那么栈1和栈2的数据需要完全相反,那么队列两端就完全暴露出来了。自己画个图出来就更明显了。代码如下:import java.util.Stack; public class MyQueue { private Stack<String> stackFirst = new Stack<String>(); private Stack<String> stackSecond = new Stack<String>(); public boolean offer(String str){ if(stackSecond.empty()){ stackFirst.push(str); }else{ while(!stackSecond.empty()){ stackFirst.push(stackSecond.pop()); } stackFirst.push(str); } return true; } public String poll(){ if(!stackSecond.empty()){ return stackSecond.pop(); }else{ while(!stackFirst.empty()){ stackSecond.push(stackFirst.pop()); } return stackSecond.pop(); } } public boolean empty(){ if(stackFirst.empty() && stackSecond.empty()) return true; return false; } public static void main(String[] args){ MyQueue queue = new MyQueue(); queue.offer("hello "); queue.offer("baby "); queue.offer("!"); while(!queue.empty()){ System.out.print(queue.poll()); } } }

而对于两个队列实现一个栈,想象如果我要把刚放的东西在取出来,对于队列来说,只能是把之前的东西都先出队,才能把刚才的放的东西出队。顺理成章,那就把之前的那些数据先出队到队列2中。两个队列来回交换数据即可。不在赘述。代码如下:

import java.util.LinkedList; import java.util.Queue; public class MyStack { private Queue<String> queueFirst = new LinkedList<String>(); private Queue<String> queueSecond = new LinkedList<String>(); public String push(String str){ if(queueSecond.isEmpty()){ queueFirst.offer(str); }else if(queueFirst.isEmpty()){ queueSecond.offer(str); } return str; } public String pop(){ if(!queueFirst.isEmpty()){ while(queueFirst.size() > 1){ queueSecond.offer(queueFirst.poll()); } return queueFirst.poll(); }else if(!queueSecond.isEmpty()){ while(queueSecond.size() > 1){ queueFirst.offer(queueSecond.poll()); } return queueSecond.poll(); } return null; } public boolean empty(){ if(queueFirst.isEmpty() && queueSecond.isEmpty()) return true; return false; } public static void main(String[] args){ MyStack stack = new MyStack(); stack.push("hello"); stack.push("baby"); stack.push("!"); while(!stack.empty()){ System.out.print(stack.pop()); } } }

相关文章:

  • Java之字符流操作-复制文件
  • 判断是否长按某一键
  • 【Android】封装一个简单好用的打印Log的工具类
  • centos7 防火墙 开启端口 并测试
  • 设计模式
  • IDA.快捷键_ZC收集
  • 直接从google中引入jquery.js
  • Sql注入攻击
  • linux下vsftpd客户端时间不一致问题
  • 3.2 使用STC89C52控制MC20发送短信
  • POJ 2823 Sliding Window 单调队列
  • 别人做的扫地机器人,有机会我也想搞一台!
  • backgroundworker与Thread区别
  • 数据类型--字符串
  • 如果在BackgroundWorker运行过程中关闭窗体…
  • gcc介绍及安装
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • java2019面试题北京
  • mysql中InnoDB引擎中页的概念
  • 笨办法学C 练习34:动态数组
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 跨域
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 前端js -- this指向总结。
  • 浅谈web中前端模板引擎的使用
  • 什么是Javascript函数节流?
  • 想写好前端,先练好内功
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 一些关于Rust在2019年的思考
  • 自制字幕遮挡器
  • ​VRRP 虚拟路由冗余协议(华为)
  • # Panda3d 碰撞检测系统介绍
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (3)(3.5) 遥测无线电区域条例
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (ZT)一个美国文科博士的YardLife
  • (一)RocketMQ初步认识
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)【Hibernate总结系列】使用举例
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net Remoting常用部署结构
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET企业级应用架构设计系列之结尾篇
  • .net专家(高海东的专栏)
  • @Autowired自动装配
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [100天算法】-实现 strStr()(day 52)