当前位置: 首页 > news >正文

代码随想录算法训练营第十天|LeetCode 232 用栈实现队列、LeetCode 225 用队列实现栈、LeetCode 20 有效的括号、LeetCode 1047 删除字符串中的所有相邻重复项

参考文章均来自代码随想录
栈与队列理论文章链接

LeetCode 232 用栈实现队列

参考文章链接
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:

你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。、

示例 1: 输入: ["MyQueue", "push", "push", "peek", "pop", "empty"] [[], [1], [2], [], [], []] 输出: [null, null, null, 1, 1, false] 解释: MyQueue myQueue = new MyQueue(); myQueue.push(1); // queue is: [1] myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue) myQueue.peek(); // return 1 myQueue.pop(); // return 1, queue is [2] myQueue.empty(); // return false

本题没什么算法 主要就是模拟 关键在于想到需要用两个栈解决
一个栈无法实现队列功能
另外一个关键是队列pop时 需将负责进队列的栈中的所有数据导入负责出队列的栈中
否则会导致顺序出错

classMyQueue{public:stack<int>stIn;stack<int>stOut;MyQueue(){}voidpush(intx){stIn.push(x);}intpop(){if(stOut.empty()){// 只有当stOut为空的时候,再从stIn里导入数据,且要导入全部数据while(!stIn.empty()){stOut.push(stIn.top());stIn.pop();}}intresult=stOut.top();stOut.pop();returnresult;}intpeek(){intres=this->pop();// 直接使用已有的pop函数stOut.push(res);// 因为pop函数弹出了元素res,所以再添加回去returnres;}boolempty(){returnstIn.empty()&&stOut.empty();}};/** * Your MyQueue object will be instantiated and called as such: * MyQueue* obj = new MyQueue(); * obj->push(x); * int param_2 = obj->pop(); * int param_3 = obj->peek(); * bool param_4 = obj->empty(); */

时间复杂度: 都为O(1)。pop和peek看起来像O(n),实际上一个循环n会被使用n次,最后还是O(1)。
空间复杂度: O(n)


LeetCode 225 用队列实现栈

参考文章链接
使用队列实现栈的下列操作:

push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空
注意:

你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。

示例: 输入: ["MyStack", "push", "push", "top", "pop", "empty"] [[], [1], [2], [], [], []] 输出: [null, null, null, 2, 2, false] 解释: MyStack myStack = new MyStack(); myStack.push(1); myStack.push(2); myStack.top(); // 返回 2 myStack.pop(); // 返回 2 myStack.empty(); // 返回 False

本题使用两个和一个队列都可以实现 一个队列更加优化
只需pop时将前面的元素重新写入队列后 获取队头元素弹出即可

classMyStack{public:queue<int>que;MyStack(){}voidpush(intx){que.push(x);}intpop(){inti=que.size();i--;while(i--){que.push(que.front());que.pop();}intres=que.front();que.pop();returnres;}inttop(){intsize=que.size();size--;while(size--){// 将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部que.push(que.front());que.pop();}intresult=que.front();// 此时获得的元素就是栈顶的元素了que.push(que.front());// 将获取完的元素也重新添加到队列尾部,保证数据结构没有变化que.pop();returnresult;}boolempty(){returnque.empty();}};/** * Your MyStack object will be instantiated and called as such: * MyStack* obj = new MyStack(); * obj->push(x); * int param_2 = obj->pop(); * int param_3 = obj->top(); * bool param_4 = obj->empty(); */

时间复杂度: pop为O(n),top为O(n),其他为O(1)
空间复杂度: O(n)


LeetCode 20 有效的括号

参考文章链接
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

示例 1: 输入:s = "()" 输出:true 示例 2: 输入:s = "()[]{}" 输出:true 示例 3: 输入:s = "(]" 输出:false 示例 4: 输入:s = "([])" 输出:true 示例 5: 输入:s = "([)]" 输出:false

本题为栈的典型应用 栈很适用于对称匹配的问题
本题关键是找出不成功的情况 排除后最后栈内为空则返回true
不匹配的情况如图:(截自代码随想录)

classSolution{public:boolisValid(string s){if(s.size()%2!=0)returnfalse;stack<char>st;for(inti=0;i<s.size();i++){if(s[i]=='(')st.push(')');elseif(s[i]=='[')st.push(']');elseif(s[i]=='{')st.push('}');//情况二和情况三elseif(st.empty()||st.top()!=s[i])returnfalse;elsest.pop();}returnst.empty();//情况一}};

时间复杂度: O(n)
空间复杂度: O(n)


LeetCode 1047 删除字符串中的所有相邻重复项

参考文章链接
给出由小写字母组成的字符串 s,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 s 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例: 输入:"abbaca" 输出:"ca" 解释: 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。

栈为什么适合做这种类似于爱消除的操作,因为栈帮助我们记录了 遍历当前元素时候,前一个元素是什么。

所以当相同时即可进行消除 非常方便

注意最后结果是反的 要再反转一下

classSolution{public:stringremoveDuplicates(string S){stack<char>st;for(chars:S){if(st.empty()||s!=st.top()){st.push(s);}else{st.pop();// s 与 st.top()相等的情况}}string result="";while(!st.empty()){// 将栈中元素放到result字符串汇总result+=st.top();st.pop();}reverse(result.begin(),result.end());// 此时字符串需要反转一下returnresult;}};

时间复杂度: O(n)
空间复杂度: O(n)

http://www.jsqmd.com/news/548442/

相关文章:

  • LabWindows/CVI报错
  • MCMC可视化指南:用动画理解马尔可夫链的收敛过程
  • Java智能地址解析工具address-parse:从混乱文本到结构化数据的终极解决方案
  • OpenClaw+Qwen3.5-9B:自动化竞品监测与分析报告生成
  • 小白也能懂的EmbeddingGemma-300m:用Ollama一键部署嵌入模型
  • 实时手机检测-通用企业应用案例:手机回收站自动分拣系统集成
  • 2026年热门的耐震压力表/隔膜压力表优质供应商推荐(信赖) - 行业平台推荐
  • Windows Cleaner终极指南:3步解决C盘爆红的免费神器!
  • 造相-Z-Image-Turbo亚洲美女LoRA实战:小宇宙播客封面图情绪传达技巧
  • 阿里龙虾悟空体验2:快上手的小助理才是正解
  • Claude Code 使用指南
  • 【latex】探索LaTeX中加粗文本的多种方法及其在表格中的优化应用
  • StructBERT在舆情监控中的应用:实时热点情感分析
  • RMBG-2.0抠图工具性能测试:RTX 3060上平均1.8秒处理一张图
  • 万物识别中文通用领域快速体验:上传图片自动识别,无需技术背景
  • S2-Pro算法优化解析:从LSTM到Transformer的演进与落地实践
  • 终极指南:5步完成黑苹果智能配置工具快速搭建
  • 墙面涂料里的有害物质到底有哪些?
  • 如何用Unity打造一款MMORPG:从零开始的全流程实战教程
  • Cosmos-Reason1-7B科研实操:科研实验视频数据的自动现象标注与推理报告生成
  • AcousticSense AI部署指南:小白也能搭建的音乐分析平台
  • 5步解锁多用户远程桌面:面向家庭与小型团队的RDP Wrapper实用指南
  • OpenCores开源项目实战:如何利用Verilog项目快速提升FPGA开发技能
  • AI Agent核心:Harness比模型更重要,精通它才能让AI真正落地!
  • OpenClaw 2026年阿里云8分钟本地云端集成零基础部署及使用教程
  • Windows Cleaner:彻底解决C盘爆红问题的完整实用指南
  • SenseVoice-Small模型在网络安全领域的语音分析应用
  • 广州婚纱照哪个效果好
  • 美团智能抢券助手:自动抢券与签到工具,让外卖优惠不错过
  • Qwen3-0.6B-FP8助力计算机组成原理教学:交互式问答与概念图解