【总结】队列与栈
栈
进出在同一侧,且满足后进先出,先进后出
车厢调度(train)
有一个火车站,铁路如图所示,每辆火车从A驶入,再从B方向驶出,同时它的车厢可以重新组合。假设从A方向驶来的火车有n节(n≤1000),分别按照顺序编号为1,2,3,…,n。假定在进入车站前,每节车厢之间都不是连着的,并且它们可以自行移动到B处的铁轨上。另外假定车站C可以停放任意多节车厢。但是一旦进入车站C,它就不能再回到A方向的铁轨上了,并且一旦当它进入B方向的铁轨,它就不能再回到车站C。
负责车厢调度的工作人员需要知道能否使它以a1,a2,…,an的顺序从B方向驶出,请来判断能否得到指定的车厢顺序。
解析:
观察发现,整个调度过程其实是在模拟入栈出栈的过程,而这个过程中,我们可以分成三种状态:栈前、栈中、栈后。我们可以发现,当某个数字出栈了,说明比它小的数字要么已经出栈了,要么还在栈里,不能是入栈前状态,并且在栈中的顺序是从大到小的(从栈顶往栈底看),比如出5,那么1,2,3,4要么已经在5之前出了,要么还在栈中(假如1,3,4在栈中,从栈顶往栈底看依次为4,3,1),不能是入栈前的状态。如果某个数字要出栈,那么当前在栈中的数字都必须小于它,否则就与栈的性质矛盾,不合法,于是我们可以这样解决:
从第一个数字开始扫描,a[i]表示当前出栈的数字,如果有比a[i]大的数字还在栈中,那么就产生矛盾,输出“NO”;否则,标记当前数字a[i]为栈后状态,那么[1, a[i]-1]这些数字如果还没出栈,标记为栈中状态。具体我们可以用0表示为确定状态,1表示栈中状态,2表示栈后状态。
字符串匹配问题(strs)
字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]),([)]都应该输出NO。
解析:简历四个栈,记录四种符号
- 由于有优先级,所以当一个右括号匹配时,比他优先级低的括号必须已经匹配完成才行,左括号入栈即可,最后判断是否匹配完
中缀表达式值(expr)
前缀和后缀表达式都很容易求值,我们将中缀表达式转换成后缀表达式,且后缀表达式不需要括号。复杂度O(n)
- 建立一个符号栈,一个数字栈
- 如果遇到一个数,加入数字栈
- 如果遇到左括号,把左括号入符号栈
- 如果遇到右括号,不断取出符号栈顶并在数字栈中运算,直到栈顶为左括号,把左括号出栈
- 如果遇到运算符,**只要栈顶符号的优先级不低于新符号,就不断取出栈顶并运算,最后把新括号入栈。**优先级乘除乘方>加减>左括号
- 最终数字栈剩下的数字就是结果。
分析:第五点保证了先进先出(优先级相同时)以及符号相互的优先级,第四点其实就是处理括号内的运算,在符号栈中越先出去的,在后缀运算中优先级更高
括号画家
写累了,直接看代码吧:
错误代码
LJS的数据:
( ( ( { } [ ] ( ( ( )
正确输出:4
我的输出:6
为什么会这样呢?会发现我并没有考虑多出来的没有匹配的括号,计算时去掉了f.size()即栈的长度,如果在最左边,这种算法是成立的;而如果未匹配到的在中间,就是不满足题意,而我相当于把两个满足要求的子序列合并在一起了。只需判断当前子序列末尾与栈的是否完全相同即可
正解:
队列
进出在异侧,且满足先进先出,后进后出
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530439.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」