classSolution:defisValid(self, s:str)->bool:
stack =[]# 使用字典
mapping ={'(':')','[':']','{':'}'}for i in s:if i in mapping.keys():
stack.append(mapping[i])elifnot stack or stack[-1]!=i:returnFalseelse:
stack.pop()returnTrueifnot stack elseFalse# 使用一堆if elsefor i in s:if i in['(','[','{']:
stack.append(i)elif i in[')',']','}']:if stack ==[]:returnFalse
tmp = stack.pop()if i ==')'and tmp =='(':continueelif i ==']'and tmp =='[':continueelif i =='}'and tmp =='{':continueelse:returnFalseif stack:returnFalseelse:returnTrue
1047. 删除字符串中的所有相邻重复项
也可以用双指针模拟栈,但今天时间不多就没有写
classSolution:defremoveDuplicates(self, s:str)->str:
stack =[]for i in s:ifnot stack or stack[-1]!= i:
stack.append(i)else:
stack.pop()return"".join(stack)
150. 逆波兰表达式求值
后缀表达式的优点:不用括号;可以用栈
用map可以减少if else的判断
要注意pop1和pop2在进行运算时的先后
classSolution:
op_map ={'+': add,'-': sub,'*': mul,'/':lambda x, y:int(x / y)}defevalRPN(self, tokens: List[str])->int:
stack =[]for i in tokens:if i in['+','-','*','/']:
pop1 = stack.pop()
pop2 = stack.pop()
stack.append(self.op_map[i](pop2, pop1))# if i == '+': stack.append(pop2 + pop1)# elif i == '-':stack.append(pop2 - pop1)# elif i == '*':stack.append(pop2 * pop1)# elif i == '/':stack.append(int(pop2 / pop1))else:
stack.append(int(i))return stack.pop()