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

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

232.用栈实现队列
题目链接:https://leetcode.cn/problems/implement-queue-using-stacks/description/
解题思路:用两个栈实现队列,一个入栈,把入栈里面的元素全部放入出栈
代码实现:

点击查看代码
    def __init__(self):self.stack_in = [] #入栈,主要负责pushself.stack_out = [] #出栈,主要负责peek(查看栈顶元素),pop(推出栈顶元素)def push(self, x):""":type x: int:rtype: None"""self.stack_in.append(x) #有元素进来,就往in里面pushdef pop(self):""":rtype: int"""if self.empty():return None #先检查队列是否为空if self.stack_out: #如果出栈不为空,则直接弹出,只有当出栈里的旧元素全部弹出时,才会接受新元素return self.stack_out.pop()else: #如果为空,遍历入栈,把元素加进出栈for i in range(len(self.stack_in)):self.stack_out.append(self.stack_in.pop())return self.stack_out.pop()def peek(self):""":rtype: int"""#先用pop移除并返回首个元素,再把元素压回stack_outans = self.pop() #运用前面自定义的pop函数,检查了self是否为空的情况并移除了stack_out里面的首个元素self.stack_out.append(ans)return ansdef empty(self):""":rtype: bool"""#只要任何一个栈里有元素,就不为空return not (self.stack_in or self.stack_out)
  1. 用队列实现栈
    题目链接:https://leetcode.cn/problems/implement-stack-using-queues/description/
    解题思路:用一个队列实现栈,要把最后一个元素先推出。做法:把这个元素前面所有元素先推出然后从末端放回
    代码实现:
点击查看代码
    def __init__(self):self.que = deque() #创建一个队列def push(self, x):""":type x: int:rtype: None"""self.que.append(x)def pop(self):""":rtype: int"""if self.empty():return Nonefor i in range(len(self.que)-1): #遍历末端元素前面的所有元素self.que.append(self.que.popleft()) #推出最左侧的,加入到末端return self.que.popleft()def top(self): #获取栈顶元素而不移除""":rtype: int"""if self.empty():return Nonereturn self.que[-1]def empty(self):""":rtype: bool"""return not self.que
  1. 有效的括号
    题目链接:https://leetcode.cn/problems/valid-parentheses/description/
    方法:使用栈进行左右括号的匹配
    解题思路:遍历,遇到什么类型的左括号就将对应的右括号添加到栈,遇到右括号就看是否与栈里的右括号相同,相同则弹出。最后会出现三种情况:左右括号不匹配,有多余左括号,有多余右括号。
    代码实现:
点击查看代码
        stack = []for i in s:if i == '(':stack.append(')')elif i == '[':stack.append(']')elif i == '{':stack.append('}')elif not stack or i != stack[-1]: #遍历过程中出现not stack(栈为空)说明右括号多余return Falseelse:stack.pop()return True if not stack else False #如果最后都消除了,为True,如果还有右括号存在,表明多出了左括号,为False
  1. 删除字符串中的所有相邻重复项
    题目链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/description/
    法一:使用栈
    思路:用一个栈存储遍历的元素,如果栈为空或遍历的元素和栈内不一样就放入栈,如果遍历的元素和栈内一样就把栈内元素弹出,最后剩下的就是结果字符
    代码:
点击查看代码
         res = list()for i in s:if res and res[-1] == i:res.pop()else:res.append(i)return ''.join(res) #从列表的第一个元素开始连接字符串

法二:用双指针模拟栈
思路:快慢指针指向起点,快指针遍历的值赋给慢指针,如果遇到值和之前一样的情况则慢指针后退一格,快指针之后遍历的元素覆盖掉此时慢指针指向的元素
代码:

点击查看代码
        slow, fast =0, 0res = list(s)while fast < len(res):res[slow] = res[fast]if slow > 0 and res[slow] == res[slow-1]: #slow要有前值才能比较,slow>0,从第二项开始slow -= 1else:slow += 1fast += 1return ''.join(res[:slow]) #最终slow指向末尾的下一个位置,所以索引是0:slow,取不到slow

各题手绘示意图:
650d97137e706a14ad70f6a7b3151edd
2a475ba44cdfe4cbe71a2cd8ea40a45c
db06d42e9b15b16e8ed9362989c9f0bb
381c6346fe959964df078860ba1ddbf5

http://www.hskmm.com/?act=detail&tid=2625

相关文章:

  • 故障处理:access$表在数据库丢失的恢复
  • 从需求出发:教你判断选斑斑还是织信
  • PLC结构化文本设计模式——建造者模式(Builder Pattern)
  • C++ - STL - 迭代器
  • MATLAB的智能扫地机器人工作过程仿真
  • linux redis 8.2.1软件开机启动redis.service与etc下的rc.local配置2种方式
  • 在GA中添加Tag-GetDynamicSpecSourceTags().AddTag(NewTag)
  • python如何在函数中使用全局变量?
  • 296、贾生
  • ubuntu 24.04部署mysql8.0.41(glibc2.17)
  • C++ - STL - 键值对pair
  • 第四天学习:LSTM
  • MATLAB的稀疏自编码器实现
  • 题解:P2157 [SDOI2009] 学校食堂
  • LLM 应用开发中的常见模式
  • vue3 与 element-plus
  • 可爱的二维数据结构们
  • 网络安全相关职业
  • 202005_CTFHUB_Redis流量
  • langchain学习之路
  • 通义灵码产品演示: 数据库设计与数据分析
  • win10安装mysql,MySQL5.7详细教程
  • 第二周作业
  • ubuntu 24编译安装libssl.so.1.0.0
  • 9月8-13日小记 - L
  • Task2:利用 Basnet 将Task1中的所有图片转化为显著性图片
  • 代码随想录算法训练营第一天| 704.二分查找、27.移除元素、977.有序数组的平方
  • 让天下没有难查的故障:2025 阿里云 AI 原生编程挑战赛正式启动
  • kuka机器人程序备份
  • AI 测试工具20款