20. 有效的括号
题目链接:. - 力扣(LeetCode)
文档讲解:代码随想录
在有效的括号中,只要遇到一个右括号,那么就一定有一个相邻的相匹配的左括号
因此我们遇到左括号就加入栈中,遇到右括号就弹出栈顶元素,栈顶的元素就是我们最后遇到的左括号
无效的括号包含三种情况:①左右括号不匹配②左右括号的数量不相等,这个体现在遇到右括号了但是栈里没有左括号来匹配了或者是最后栈里还有左括号剩余,也就是右括号不够
技巧:在遇到左括号的时候,将匹配的右括号入栈,接下来如果遇到了右括号就只需要比较当前元素和栈顶相不相等就可以了。如果不这么做,那么遇到右括号就得分情况讨论这个右括号到底是哪一类,再看看栈顶的左括号是否是需要的
class Solution:
def isValid(self, s: str) -> bool: # 定义一个方法来检查包含括号的字符串的有效性。
stack = [] # 初始化一个空栈来存储开放括号。
for i in list(s): # 遍历输入字符串中的每个字符。
if i == "[": # 如果字符是左方括号:
stack.append("]") # 将对应的右方括号推入栈中。
elif i == "(": # 如果字符是左圆括号:
stack.append(")") # 将对应的右圆括号推入栈中。
elif i == "{": # 如果字符是左大括号:
stack.append("}") # 将对应的右大括号推入栈中。
else: # 如果字符是]}):
if not stack or stack.pop() != i: # 如果栈为空或栈顶元素与当前字符不匹配:
return False # 返回False,表示字符串无效。
return not stack # 最终如果栈为空,则返回True,表示字符串有效;否则返回False。
1047. 删除字符串中的所有相邻重复项
题目链接:. - 力扣(LeetCode)
文档讲解:代码随想录
在删除相邻重复项的时候,其实就是要知道当前遍历的这个元素,我们在前一位是不是遍历过一样数值的元素,那么如何记录前面遍历过的元素呢?
所以就是用栈来存放,那么栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,我们就需要去看上一个遍历过的元素与这个元素是否相等,也就是栈顶元素,如果相等则出栈
class Solution:
def removeDuplicates(self, s: str) -> str:
stack = []
for i in list(s):
#如果栈为空,或是栈顶元素与当前遍历到的元素不相等
if not stack or stack[-1] != i:
stack.append(i)
continue
if stack[-1] == i:
stack.pop()
return ''.join(stack)
150. 逆波兰表达式求值
题目链接:. - 力扣(LeetCode)
文档讲解:代码随想录
逆波兰表达式:
只要明白逆波兰表达式中的运算符是对运算符前两个数进行操作的即可。那么只要遇到了运算符弹出刚刚遇到的两个数字即可
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
op_map = {'+': add, '-': sub, '*': mul, '/': lambda x, y: int(x / y)} #要点1
for i in tokens:
if i not in ["+","-","*","/"]: #不能直接判断i是不是数字,因为i都是字符串,也不能用int(i),因为i如果是运算符,就不能int操作
stack.append(i)
else:
num2 = int(stack.pop())
num1 = int(stack.pop())
stack.append(op_map[i](num1,num2))
return int(stack.pop())
总结
总结以上三个题可以发现,它们都是处理在遍历过程中,如果遇到了某个元素,那就要对这个元素相邻的左边的元素进行处理,这就用到了栈,后进先出,我们需要的元素是最后遍历到的。栈的后进先出特性可以确保我们首先处理最后遍历到的元素。