剑指 Offer 09. 用两个栈实现队列

剑指 Offer 09. 用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

输入:
["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

  • 方法:
  1. 双栈

队列:“先进先出”

栈:“先进后出”

stack1作为压入栈,stack2作为输出栈

尾添操作:

  • 直接在stack1栈顶添加val
  1. 头删操作:
  • 如果stack2不为空(表示输出栈已经有完成倒序的元素

  • 直接弹出stack2栈顶元素

  • 如果stack2为空,且stack1也为空(没有元素)

  • 返回-1

  • stack2为空,stack1不为空

  • 将stack1压入stack2,弹出栈顶

class CQueue {
public:
stack<int> s1, s2;
void appendTail(int value) {
s1.push(value);
}
int deleteHead() {
if(!s2.empty()) {
int res = s2.top();
s2.pop();
return res;
}
if (s1.empty()) return -1;
while(!s1.empty()) {
s2.push(s1.top());
s1.pop();
}
int res = s2.top();
s2.pop();
return res;
}
};

复杂度分析:

  • 时间复杂度:appendTail为O(1),deleteHead均摊为O(1),因为对于每个元素只会移动一次
  • 空间复杂度:O(n) n为元素个数

posted on   SocialistYouth  阅读(9)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人

统计

点击右上角即可分享
微信分享提示