Leikou Brushing Notes: 227. Calculadora básica II (La pila se usa para procesar la prioridad de los operadores, principalmente porque la lógica debe ser clara, el código es muy simple y el primo pequeño puede entenderlo)

tema:

227 、 Calculadora básica II

Darle una expresión de cadena s, implemente una calculadora básica para calcular y devolver su valor.

La división entera solo conserva la parte entera.

Ejemplo 1:

Entrada: s = "3 + 2 * 2"
Salida: 7

Ejemplo 2:

Entrada: s = "3/2"
Salida: 1

Ejemplo 3:

Entrada: s = "3 +
5/2 " Salida: 5

inmediato:

1 <= s.length <= 3 * 10 ^ 5
s se compone de números enteros y operadores ('+', '-', '*', '/'), separados por algunos espacios,
s representa una expresión válida
Todos los enteros en la expresión son números enteros no negativos y están en el rango [0, 2 ^ 31-1]. Los
datos de la pregunta garantizan que la respuesta es un entero de 32 bits

Ideas de solución de problemas:

Dado que la multiplicación y la división tienen prioridad sobre los cálculos de suma y resta, es posible que desee considerar realizar primero todas las operaciones de multiplicación y división, y poner los valores enteros después de estas operaciones de multiplicación y división en las posiciones correspondientes de la expresión original, luego la El valor de toda la expresión es igual a una serie de suma y resta de números enteros después del valor.

En base a esto, podemos usar una pila para almacenar el valor de estos números enteros (después de las operaciones de multiplicación y división). Para el número después del signo más y menos, empújelo directamente en la pila; para el número después del signo de multiplicación y división, puede calcular directamente con el elemento superior de la pila y reemplazar el elemento superior de la pila con el resultado del cálculo.

Específicamente, atraviesa la cadena s y usa la variable preSign para registrar el operador antes de cada número. Para el primer número, el operador antes de él se considera un signo más. Cada vez que atraviesa hasta el final del número, el método de cálculo se determina de acuerdo con preSign:

Signo más: coloca el número en la pila;
signo menos: coloca el número opuesto del número en la pila;
signo de multiplicar y dividir: calcular el número y el elemento superior de la pila, y reemplazar el elemento superior de la pila con el resultado del cálculo.
En la implementación del código, si se lee un operador, o se atraviesa el final de la cadena, se considera que se atraviesa el final del número. Después de procesar el número, actualice preSign al carácter actualmente atravesado.

Después de atravesar la cadena s, acumula los elementos en la pila, que es el valor de la expresión de la cadena.

Código Python de la solución del problema:

class Solution:
    def calculate(self, s: str) -> int:
        stack = []
        num, preSign = 0, ""   # preSign为当前运算符的上一个符号
        for i in range(len(s)):
            if s[i].isdigit():
                num = num*10+int(s[i])
            if not s[i].isdigit() and s[i]!=" " or i==len(s)-1:  # 在下一个符号或字符结束处进行计算
                if preSign=="":
                    stack.append(num)
                elif preSign=="+" or preSign=="-":
                    stack.append(num if preSign=="+" else -num)
                elif preSign=="*":
                    stack[-1] *= num
                elif preSign=="/":
                    stack[-1] /= num
                    stack[-1] = int(stack[-1])   # 取整
                num = 0
                preSign = s[i]
            # print(s[i], preSign, stack)
        return sum(stack)

Autor:
enlaces a -qing-ge : https://leetcode-cn.com/problems/basic-calculator-ii/solution/guan-fang-ti-jie-zhan-pythonban-by-a-qin-p00z/
sources : LeetCode https://leetcode-cn.com/problems/basic-calculator-ii/

Supongo que te gusta

Origin blog.csdn.net/weixin_44414948/article/details/114653105
Recomendado
Clasificación