当前位置: 首页 > 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.cnnetsun.cn/news/1531664.html

相关文章:

  • 【文献速递】固相碳源-化学气相沉积法制备碳纤维/碳纳米管复合材料的电磁波吸收与焦耳热性能研究
  • Leather Dress Collection 风格迁移实战:将名画风格应用于皮革设计
  • 美团天天神券自动化抢券完整指南:告别手动烦恼,轻松月省200元 [特殊字符]
  • 通义千问3-VL-Reranker-8B在金融风控中的创新应用
  • VMware16 NAT模式频繁掉线?5分钟搞定静态IP配置(附详细排查步骤)
  • FRP内网穿透实战:从零配置到远程访问
  • BGV vs BFV:基于LWE的两大全同态加密方案,到底该怎么选?
  • MogFace人脸检测WebUI与STM32CubeMX联合开发:嵌入式视觉系统构建
  • 将XXXUtils合而为一
  • SenseVoice-Small模型在网络安全领域的语音分析应用
  • 别再死记硬背了!用主成分分析(PCA)的实战案例,反向理解线性代数里的谱分解
  • CTF图片隐写
  • VuGen录制脚本全流程详解
  • 别再谈虚的:中小企业老板,品牌战略到底是个啥?佛山鼎策创局破局增长咨询
  • 键盘优化与输入稳定性提升:机械键盘连击问题的软件解决方案
  • Java中如何开发数字人
  • 为什么你的单片机ADC采集总是不准?多半是漏了这个“隔离神器”!
  • YOLO-Master 的MoE方案分解
  • 【STM32入门踩坑记录】0、问题汇总(持续更新)
  • 别让系统误判你的努力——百考通智能优化,同步压低重复率与AI概率
  • OWL ADVENTURE与Git协作:AI视觉项目的版本管理与团队开发实践
  • 收藏!大模型技能助你年薪百万,程序员小白抓住AI红利核心钥匙!
  • 2026年OpenClaw腾讯云9分钟本地云端集成新手安装及使用指南【最新!】
  • OpenClaw学习路径:从GLM-4.7-Flash基础对接到技能市场高级应用
  • LeaguePrank:英雄联盟客户端视觉定制的安全合规解决方案
  • 保姆级教程:Windows下给Ollama搬家,轻松修改程序和模型存储路径(附环境变量配置)
  • GPT-OSS-20B真实作品分享:快速生成标准化报表与数据摘要
  • 别再只盯着SEM/EDS了!用ToF-SIMS做材料表面分析,这5个实战场景帮你打开新思路
  • 什么是 SEO,为什么 SEO 如此重要_企业应该重视 SEO 吗
  • 如何快速提升魔兽争霸3游戏体验:终极优化工具完整指南