🌈大家好!本篇文章将介绍关于栈队列堆的OJ题,来自力扣:剑指 Offer 09. 用两个栈实现队列,展示代码语言暂时为:C++代码 😇。
今天继续力扣C++打卡(12.08)!✊✊✊
🔒1、题目:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
🌲示例 1🌲:
输入:
["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]
🌲示例 2🌲:
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
❗️ 限制❗️ :
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用
来源:力扣(LeetCode)👈
链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/description/?orderBy=most_votes
☀️2、思路:
我们首先应了解,队列是先入先出,而栈是后入先出。
使用两个栈来实现队列功能,
1️⃣ 给两个栈分工不同,一个为入队栈,一个为出队栈,各自负责入队和出队;
2️⃣ 入队操作,直接压入入队栈即可;
3️⃣ 出队操作,优先检查出队栈是否有数据,若无,将入队栈全部推入到出队栈中,然后将栈顶返回(实质是将入队栈反转,取入队栈的栈底),将栈顶pop。
复杂度分析:
⏳时间复杂度:appendTail()函数为 O(1) ;deleteHead() 函数在 N次队首元素删除操作中总共需完成 N个元素的倒序。
🏠空间复杂度 O(N) :最差情况下,栈 A 和 B 共保存 N个元素。
🔑3、代码:
class CQueue {
public:
stack<int> one,two;
CQueue() { }
void appendTail(int value) {
one.push(value);
}
int deleteHead() {
if(two.empty()){
if(one.empty()){
return-1;
}
while(!one.empty()){
two.push(one.top());
one.pop();
}
}
int value=two.top();
two.pop();
return value;
}
};
🐾4、总结
🌈题目理解起来比较复杂,重点需要理清输出是怎么来的,栈是先入后出的,两个栈来实现队列先入先出,最开始想法应该是需要进行反转。而在push的时候,不必将two还原至one,因为根据题目要求,只要出队元素顺序,以及出队判空操作正确,结果便正确,这样做复杂度最低。
🚀🚀觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦🙏 🙏🙌 !