Estructura de datos y algoritmo _ evaluación de expresión polaca inversa de pila _ implementación de python

Primero te cuento dos puntos de conocimiento:

  • La expresión de prefijo también se conoce como polaco. El operador de la expresión de prefijo se encuentra antes del operando. La expresión aquí es la expresión matemática que usualmente usamos para operaciones matemáticas.
  • La expresión de sufijo es la expresión polaca inversa mencionada en el título. Es diferente del lugar habitual del símbolo de operación entre los operandos. La expresión de sufijo coloca al operador después del operando.

Por ejemplo: 6-1 + 3 * 2 = 11 es una expresión infija.

En correspondencia con el polaco, la expresión de prefijo es: ['-', '6', '1', '*', '+', '3', '2']

Correspondiente polaco inverso, la expresión de sufijo es: ['6', '1', '-', '3', '2', '*', '+']

Tres métodos de evaluación de expresiones.

La expresión de computadora de la expresión de prefijo
escanea la expresión de derecha a izquierda. Cuando encuentra un número, empuja el número a la pila. Cuando encuentra un operador, muestra los dos números en la parte superior de la pila y usa el operador para calcularlos en consecuencia El elemento superior y el segundo elemento superior), y coloque el resultado en la pila; repita el proceso anterior hasta el extremo izquierdo de la expresión, y el valor de la operación final es el resultado de la expresión

Por ejemplo : (3 + 4) × 5-6 La expresión de prefijo correspondiente es- × + 3 4 5 6. Los pasos para evaluar la expresión de prefijo son los siguientes:

  1. Escanee de derecha a izquierda y presione 6, 5, 4, 3 en la pila
  2. Encuentra el operador +, entonces pop 3 y 4 (3 es el elemento superior de la pila, 4 es el segundo elemento superior), calcula el valor de 3 + 4, obtén 7 y luego coloca 7 en la pila
  3. El siguiente es el operador ×, así que explota 7 y 5, calcula 7 × 5 = 35 y presiona 35 en la pila
  4. Finalmente, el operador calcula el valor de 35-6, que es 29, que da el resultado final

Expresión infija

  1. Las expresiones infijadas son expresiones aritméticas comunes, como (3 + 4) × 5-6

  2. La evaluación de la expresión infija es la más familiar para nosotros, pero no es fácil de operar para la computadora (este problema se puede ver en el caso del que hablamos anteriormente), por lo tanto, al calcular el resultado, la expresión infija a menudo se expresa La expresión se convierte en otras expresiones para operar (generalmente se convierte en expresiones de sufijo).

Expresión de sufijo

  1. La expresión de sufijo también se denomina expresión polaca inversa, similar a la expresión de prefijo, excepto que el operador está detrás del operando

  2. Por ejemplo: (3 + 4) × 5-6 La expresión de sufijo correspondiente es 3 4 + 5 × 6 -

  3. Otro ejemplo:
    Inserte la descripción de la imagen aquí

La evaluación por computadora de la expresión de sufijo
escanea la expresión de izquierda a derecha. Cuando encuentra un número, empuja el número a la pila. Cuando encuentra un operador, muestra los dos números en la parte superior de la pila y usa el operador para calcularlos en consecuencia ( El segundo elemento superior y el elemento superior de la pila), y coloque el resultado en la pila; repita el proceso anterior hasta el extremo derecho de la expresión, el valor obtenido por la operación final es el resultado de la expresión

Por ejemplo: (3 + 4) × 5-6 La expresión de sufijo correspondiente es 3 4 + 5 × 6-, los pasos de evaluación para la expresión de sufijo son los siguientes:

  1. Escanee de izquierda a derecha y presione 3 y 4 en la pila;
  2. Cuando se encuentra el operador +, se abren 4 y 3 (4 es el elemento superior de la pila, 3 es el segundo elemento superior), se calcula el valor de 3 + 4 y se obtiene 7, y luego se empuja 7 a la pila;
  3. Pon 5 en la pila;
  4. El siguiente es el operador ×, por lo que se muestran 5 y 7, se calcula 7 × 5 = 35 y se empuja 35 a la pila;
  5. Pon 6 en la pila;
  6. Finalmente, el operador calcula el valor de 35-6, que es 29, que da el resultado final

De los métodos de evaluación de las tres expresiones anteriores se puede ver que la implementación en computadora de la expresión de sufijo es la más conveniente. Usar una estructura de pila para el cálculo es fácil de implementar.

Convertir expresión infija en expresión sufijo

Este es el paso más complicado para realizar la operación de expresiones ordinarias. El algoritmo específico involucra muchos detalles:

  1. Inicialice dos pilas: la pila del operador s1 y la pila s2 que almacena los resultados intermedios;

  2. Escanee expresiones infijadas de izquierda a derecha;

  3. Cuando encuentre un operando, presione hacia s2;

  4. Cuando encuentre un operador, compare su prioridad con el operador superior de la pila s1

  5. Si s1 está vacío, o el operador en la parte superior de la pila es el soporte izquierdo "(", entonces este operador se empuja directamente sobre la pila;

    De lo contrario, si la prioridad es más alta que el operador de la parte superior de la pila, el operador también se empuja a s1; de lo
    contrario, el operador en la parte superior de s1 aparece y se empuja a s2, y luego se dirige a (4-1) y s1 nuevamente. Se compara la parte superior del operador de pila;

  6. Al encontrar paréntesis: (1) Si es el paréntesis izquierdo "(", luego presione s1 directamente (2)
    Si es el paréntesis derecho ")", entonces el operador en la parte superior de la pila s1 aparece en secuencia, y s2 se presiona hasta que encuentra Hasta el paréntesis izquierdo, luego descarte el par de paréntesis y repita los pasos 2 a 5 hasta el extremo derecho de la expresión

  7. Pop los operadores restantes en s1 en secuencia y presione en s2

  8. Los elementos en s2 aparecen a su vez y se muestran como salida. El orden inverso del resultado es la expresión de sufijo correspondiente a la expresión de infijo

    Código específico:

expression = "6-1+3*2"#中缀表达式
print("原式为中缀表达式 :"+expression)
Expression=list(expression)
s1 = stack()
s2 = list()
oper = Operation()
for item in list(Expression):
    if re.findall(r'\d+',item):
        s2.append(item)
    elif item=='(':
        s1.push(item)
    elif item==')':
        while (s1.peek()!='('):
            s2.append(s1.pop())
        s1.pop()
    else:
        while s1.size()!=0 and oper.getValue(s1.peek())>=oper.getValue(item):
            s2.append(s1.pop())
        s1.push(item)
while s1.size()!=0:
    s2.append(s1.pop())
    
print("转化得到的后缀表达式列表:",end='')
print(s2)

Calcular el resultado de la expresión de sufijo

Este paso es relativamente simple, solo necesita inicializar una pila y juzgar las expresiones de sufijo una por una. El algoritmo específico es el siguiente:
1) Inicializar una pila, denominada pila
2) Usar la estructura de bucle para escanear la expresión de expresión de sufijo entrante
3) Determinar si cada ciclo es un número:
si es un número, se inserta en la pila.
Si no, se juzga Para qué operador, realice la operación correspondiente y asigne el resultado al resultado
4) Solo quedará un valor en la pila al final, y este valor es el resultado de la operación de la expresión de sufijo.
Código específico:

'''
计算后缀表达式的结果
'''
#suffixExpression = "10 4 + 5 * 6 -" 
#split = suffixExpression.split(' ')
#stack = []
s = stack()
for item in list(s2):
    if re.findall(r'\d+',item):
        s.push(item)
    else:
        num2 =int( s.pop())
        num1 =int( s.pop())
        res = 0
        if item=='+':
            res = num1 + num2
        elif item=='-':
            res = num1 - num2
        elif item=='*':
            res = num1 * num2
        elif item=='/':
            res = num1 / num2
        else:
            print("符号错误")
        s.push(''+str(res))
        
print("计算得后缀表达式得: %s = %d"%(expression,int(s.pop())))
27 artículos originales publicados · elogiados 2 · visitas 680

Supongo que te gusta

Origin blog.csdn.net/qq_44273739/article/details/105098026
Recomendado
Clasificación