【剑指offer】面试题09:用两个栈实现队列(Java)
appendTail:将元素推送到第二个栈。 deleteHead:将第一个栈的元素弹出并推送到第二个栈,直到第一个栈为空。
发布日期:2021-04-30 21:03:56
浏览次数:111
分类:精选文章
本文共 1015 字,大约阅读时间需要 3 分钟。
用两个栈实现一个队列
问题描述
实现一个队列数据结构,仅能通过两端操作,分别在队列尾部插入整数和在队列头部删除整数。若队列为空时,删除操作返回-1。
方法思路
传统的队列可以通过数组或链表实现,但当需要通过两端操作时,使用两个栈是更有效的方法。具体来说,将一个栈用于队列的存储,另一个栈用于辅助操作。
核心思路
这种方法利用了栈的先进后出特性,使得队列的操作变得可行。
代码实现
public class CQueue { private Stack stack1; private Stack stack2; public CQueue() { stack1 = new Stack<>(); stack2 = new Stack<>(); } public void appendTail(int value) { while (!stack2.isEmpty()) { stack1.push(stack2.pop()); } stack1.push(value); } public int deleteHead() { while (!stack1.isEmpty()) { stack2.push(stack1.pop()); } if (stack2.isEmpty()) { return -1; } return stack2.pop(); }} 优化解释
appendTail:
- 将第二个栈中的所有元素依次弹出并推送到第一个栈。
- 最后将新元素推送到第一个栈的顶部。
deleteHead:
- 将第一个栈的所有元素依次弹出并推送到第二个栈。
- 检查第二个栈是否为空,若为空则返回-1,否则返回第二个栈的顶部元素。
这种方法确保了队列的操作符合预期,同时保持了较低的时间复杂度。
总结
通过两个栈的巧妙结合,可以高效实现队列的基本操作。这种设计既简洁又高效,适用于需要频繁队列操作的场景。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2026年06月11日 03时32分42秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP操作csv文件导入+导出
2023-03-01
php操作mysql用select_php如何操作mysql获取select 结果
2023-03-01
PHP操作符与控制结构
2023-03-01
PHP支付宝SDK使用,电脑网页支付
2023-03-01
php支付宝手机网页支付类实例
2023-03-01
PHP改变数组key值的方法
2023-03-01
php教程之php空白页的原因及解决方法
2023-03-01
PHP数据库操作
2023-03-01
PHP数据文件过大,导致PHP加速器eaccelerator在PHP5.2版本下崩溃
2023-03-01
RabbitMQ - 死信、TTL原理、延迟队列安装和配置
2023-03-01
PHP数据访问的多重查询(租房子查询)
2023-03-01
RabbitMQ - 如保证消息的可靠性?(消息确认、消息持久化、失败重试机制)
2023-03-01
RabbitMQ - 基于 SpringAMQP 带你实现五种消息队列模型
2023-03-01
php数组函数分析--array_column
2023-03-01
php数组去重复数据的小例子
2023-03-01
php数组实现:哈希 +双向链表
2023-03-01
PHP数组排序函数array_multisort()函数详解(二)
2023-03-01
php数组的几个函数和超全局变量
2023-03-01
PHP文件上传详解
2023-03-01
PHP文件锁
2023-03-01