代码随想录算法训练营第十二天(队列与栈篇)|1047.删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

1047. 删除字符串中的所有相邻重复项 

题目链接:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

题目大意:找到字符串s中的重复项并删除,重复操作直到不能删为止。

题目难点:需要重复操作,好比玩儿"对对碰”,一直都是个动态的过程,因此如果暴力算法,用一层for循环无法完成,并且难以判断什么时候停止。

解题思路:同样使用栈。建一个栈,将遍历到的元素和弹出的栈顶比较,如果不同,就将弹出的栈顶重新加入

class Solution(object):
    def removeDuplicates(self, s):
        stack = []
        for string in s:
            if stack == []:
                stack.append(string)
            elif stack != []: 
                ans = stack.pop()
                if string == ans:
                    continue
                else: 
                    stack.append(ans)
                    stack.append(string)
        answer = ''
        for s in stack:
            answer += s
        return answer

对比了解析,我才发现我有点傻,昨天刚接触到栈的pop,受到昨天的题目的思维定式:把元素pop出来比较,如果不相同又要append回去,这不是太麻烦了,直接比较队列中的倒数第一个元素和遍历的元素不就行了!另外,当stack为空和stack不为空且不匹配时,操作可以合并:都是讲遍历的元素添加到stack中。

class Solution(object):
    def removeDuplicates(self, s):
        stack = []
        for string in s:
            if stack and string == stack[-1]:
                stack.pop()
            else:
                stack.append(string)
        return ''.join(stack)

150. 逆波兰表达式求值

题目链接:150. 逆波兰表达式求值 - 力扣(LeetCode)

中缀式与后缀式

中缀式:(1+2)×(3+4)   便于理解,但需要依赖括号优先级。

逆波兰表达式(后缀式):12+34+×  不用考虑括号优先级,只需按顺序运算。

使用栈

当遍历到数字时,添加到栈中,当遍历到符号,弹出栈最顶部的两个数字,进行运算,加结果加入栈中。

注意:

  1. 乘法和除法运算需要注意数字的顺序。
  2. 使用Python2时,除法“\"是整数除法,而在Python3中是浮点数除法。我使用的是Python2,所以为了向零取整,除法运算应该是:
    int(float(a)/b)

     直接用int(a/b) 会向下取整,比如:-3 / 2 = -2;先用 float 转换一下的话,比如 int(float(a)/b),就会得到一个浮点数,比如 -3 / 2.0 = -1.5,最后取整是 -1。

    class Solution(object):
        def evalRPN(self, tokens):
            stack = []
            for element in tokens:
                if element not in {'+', '-', '*', '/'}:
                    stack.append(int(element))
                else:
                    b = stack.pop()
                    a = stack.pop()
                    if element == '+':
                        stack.append(a + b)
                    elif element == '-':
                        stack.append(a - b)
                    elif element == '*':
                        stack.append(a * b)
                    elif element == '/':
                        stack.append(int(float(a) / b))
            return stack.pop()
    

你可能感兴趣的:(算法,python)