【Java】 剑指offer(8) 用两个栈实现队列
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【Java】 剑指offer(8) 用两个栈实现队列,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1670字,纯文字阅读大概需要3分钟。
内容图文
本文参考自《剑指offer》一书,代码采用Java语言。
题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
思路
这道题较简单,自己先试着模拟一下插入删除的过程(在草稿纸上动手画一下):插入肯定是往一个栈stack1中一直插入;删除时,直接出栈无法实现队列的先进先出规则,这时需要将元素从stack1出栈,压到另一个栈stack2中,然后再从stack2中出栈就OK了。需要稍微注意的是:当stack2中还有元素,stack1中的元素不能压进来;当stack2中没元素时,stack1中的所有元素都必须压入stack2中。否则顺序就会被打乱。
测试用例
1.往空队列添加删除元素
2.往非空队列添加删除元素
3.删除至队列为空
完整Java代码
(含测试代码)
import java.util.Stack; /** * * @Description 用两个栈实现队列 * * @author yongh * @date 2018年9月13日 下午2:17:22 */ // 题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail // 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。 public class QueueWithTwoStacks { class Queue{ Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); /** * 插入结点 */ public void push(int node) { stack1.push(node); } /** * 删除结点 */ public int pop() { if (stack2.empty()) { if (stack1.empty()) throw new RuntimeException("队列为空!"); else { while (!stack1.empty()) stack2.push(stack1.pop()); } } return stack2.pop(); } } //=======测试代码========== public void test1() { Queue queue= new Queue(); queue.push(1); queue.push(2); System.out.println(queue.pop()); queue.push(3); System.out.println(queue.pop()); System.out.println(queue.pop()); } /** * 往空队列删除元素 */ public void test2() { Queue queue= new Queue(); System.out.println(queue.pop()); } public static void main(String[] args) { QueueWithTwoStacks demo = new QueueWithTwoStacks(); demo.test1(); demo.test2(); } }
1 2 3 Exception in thread "main" java.lang.RuntimeException: 队列为空!
收获
1.学会用画图将抽象问题形象化
原文:https://www.cnblogs.com/yongh/p/9640514.html
内容总结
以上是互联网集市为您收集整理的【Java】 剑指offer(8) 用两个栈实现队列全部内容,希望文章能够帮你解决【Java】 剑指offer(8) 用两个栈实现队列所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。