当前位置:网站首页>一刷314-剑指 Offer 09. 用两个栈实现队列(e)
一刷314-剑指 Offer 09. 用两个栈实现队列(e)
2022-04-23 15:35:00 【丿唐宋】
题目:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,
分别完成在队列尾部插入整数和在队列头部删除整数的功能。
(若队列中没有元素,deleteHead 操作返回 -1 )
-----------------
示例:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用
----------------
思路:
解题思路:
栈无法实现队列功能: 栈底元素(对应队首元素)无法直接删除,需要将上方所有元素出栈。
双栈可实现列表倒序: 设有含三个元素的栈 A = [1,2,3]和空栈 B = []
若循环执行 A 元素出栈并添加入栈 B ,直到栈 A 为空,则 A = []B = [3,2,1],
即 栈 B 元素实现栈 A 元素倒序 。
利用栈 B 删除队首元素: 倒序后,B 执行出栈则相当于删除了 A 的栈底元素,即对应队首元素。

函数设计:
题目只要求实现 加入队尾appendTail() 和 删除队首deleteHead() 两个函数的正常工作,
因此我们可以设计栈 A 用于加入队尾操作,栈 B 用于将元素倒序,从而实现删除队首元素。
加入队尾 appendTail()函数: 将数字 val 加入栈 A 即可。
删除队首deleteHead()函数: 有以下三种情况。
当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。
否则,当 A 为空: 即两个栈都为空,无元素,因此返回 -1。
否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。
-----------
复杂度分析:
由于问题特殊,以下分析仅满足添加 N 个元素并删除 N 个元素,即栈初始和结束状态下都为空的情况。
时间复杂度: appendTail()函数为 O(1);deleteHead()
函数在 N 次队首元素删除操作中总共需完成 N 个元素的倒序。
空间复杂度 O(N): 最差情况下,栈 A 和 B 共保存N个元素。
---------------------

class CQueue {
//A 用来添加 B 用来删除 B是A的倒序
LinkedList<Integer> A, B;//定义两个栈
public CQueue() {
//初始化
A = new LinkedList<Integer>();
B = new LinkedList<Integer>();
}
public void appendTail(int value) {
//A的末端添加元素
A.addLast(value);
}
public int deleteHead() {
if (!B.isEmpty()) return B.removeLast();//特判
if (A.isEmpty()) return -1;//特判
while (!A.isEmpty()) {
//B为空 A不为空, 先让B获得A的元素
B.addLast(A.removeLast());
}
return B.removeLast();
}
}
注: return B.removeLast(); 要作为返回值
/** * Your CQueue object will be instantiated and called as such: * CQueue obj = new CQueue(); * obj.appendTail(value); * int param_2 = obj.deleteHead(); */
版权声明
本文为[丿唐宋]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_45170946/article/details/124363467
边栏推荐
- Kubernetes详解(十一)——标签与标签选择器
- Sword finger offer (1) -- for Huawei
- What are the mobile app software testing tools? Sharing of third-party software evaluation
- Mysql database explanation (IX)
- CVPR 2022 优质论文分享
- 开源项目推荐:3D点云处理软件ParaView,基于Qt和VTK
- 携号转网最大赢家是中国电信,为何人们嫌弃中国移动和中国联通?
- 移动app测试如何进行?
- 让阿里P8都为之着迷的分布式核心原理解析到底讲了啥?看完我惊了
- G007-hwy-cc-estor-03 Huawei Dorado V6 storage simulator construction
猜你喜欢

c语言---指针进阶

Detailed explanation of MySQL connection query

The wechat applet optimizes the native request through the promise of ES6

Sword finger offer (2) -- for Huawei

木木一路走好呀

机器学习——逻辑回归

For examination

API gateway / API gateway (II) - use of Kong - load balancing

Detailed explanation of redirection and request forwarding

大厂技术实现 | 行业解决方案系列教程
随机推荐
Sword finger offer (2) -- for Huawei
Collation of errors encountered in the use of redis shake
移动金融(自用)
KNN, kmeans and GMM
Hj31 word inversion
开源项目推荐:3D点云处理软件ParaView,基于Qt和VTK
Connect PHP to MSSQL via PDO ODBC
木木一路走好呀
el-tree实现只显示某一级复选框且单选
fatal error: torch/extension. h: No such file or directory
ICE -- 源码分析
函数(第一部分)
Squid agent
GFS distributed file system (Theory)
软件性能测试报告起着什么作用?第三方测试报告如何收费?
Modify the default listening IP of firebase emulators
Go语言数组,指针,结构体
Analysis of common storage types and FTP active and passive modes
Knn,Kmeans和GMM
怎么看基金是不是reits,通过银行购买基金安全吗