Evaluación de cadenas de fórmulas

Evaluación de cadenas de fórmulas

Descripción del Título

Dada una cadena str, str representa una fórmula, la fórmula puede tener números enteros, suma, resta, multiplicación, división y paréntesis izquierdo y derecho, y devolver el resultado del cálculo de la fórmula (nota: todas las operaciones en el título son operaciones enteras, redondeadas hacia abajo y garantizadas Los datos son legales, no habrá división por 0, etc.).

Ingrese una descripción:

Genere una línea de cadena, que representa str (1 ≤ lengthstr ≤ 1000) str (1 \ leq length_ {str} \ leq 1000)s t r ( 1l e n g t hs t r1 0 0 0 ) (Asegúrese de que el resultado del cálculo de str no se divida entre cero, desbordamiento de int, etc.).

Descripción de salida:

Genera un número entero, que representa el resultado del cálculo de la expresión.

Ejemplo 1
entrar
48*((70-65)-43)+8*1
Salida
-1816
Ejemplo 2
entrar
3+1*4
Salida
7

responder:

La evaluación de expresiones generalmente convierte la expresión infija en una expresión sufija y luego, en la expresión sufija, se usan dos pilas, una para guardar el operador y la otra para guardar el número, que se puede calcular de adelante hacia atrás.

Este problema también puede hacerlo, en el proceso de expresión infija en sufijo, se debe tener en cuenta la prioridad que el operador, donde "(" prioridad más baja, seguido del operador de suma y resta , la prioridad más alta es Operador de multiplicar y dividir .

Nota : Habrá números negativos en esta pregunta, y debe juzgarlos cuando encuentre el operador '-'.

Código:
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 1010;

char s[N];
int nums[N];
char ops[N];
int k1, k2;

int grade( char op ) {
    
    
    if (op == '(') return 1;
    if (op == '+' || op == '-') return 2;
    if (op == '*' || op == '/') return 3;
    return 0;
}

void calc( char op ) {
    
    
    int y = nums[ k1-- ];
    int x = nums[ k1-- ];
    int z;
    if ( op == '+') z = x + y;
    else if ( op == '-' ) z = x - y;
    else if ( op == '*' ) z = x * y;
    else z = x / y;
    nums[ ++k1 ] = z;
}

int solve() {
    
    
    k1 = k2 = -1;
    int top = 0, val = 0;
    for (int i = 0; s[i]; ++i) {
    
    
        if ( s[i] >= '0' && s[i] <= '9' ) {
    
    
            val = val * 10 + (s[i] & 15);
            if ( s[ i+1 ] >= '0' && s[ i+1 ] <= '9' ) continue;
            nums[ ++k1 ] = val;
            val = 0;
        }
        else if ( s[i] == '(' ) ops[ ++k2 ] = s[i];
        else if ( s[i] == ')' ) {
    
    
            while ( ops[k2] != '(' ) calc( ops[ k2-- ] );
            k2--;
        }
        else {
    
    
            if ( s[i] == '-' ) {
    
    
                if ( i == 0 || s[ i-1 ] == '(' ) {
    
    
                    val = 0, ++i;
                    while ( s[i] >= '0' && s[i] <= '9' )
                        val = val * 10 + (s[ i++ ] & 15);
                    nums[ ++k1 ] = -val;
                    val = 0, --i;
                    continue;
                }
            }
            while ( k2 >= 0 && grade( ops[k2] ) >= grade( s[i] ) )
                calc( ops[ k2-- ] );
            ops[ ++k2 ] = s[i];
        }
    }
    while ( k2 >= 0 ) calc( ops[ k2-- ] );
    return nums[0];
}

int main( void )
{
    
    
    scanf("%s", s);
    printf("%d\n", solve());
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/MIC10086/article/details/108918129
Recomendado
Clasificación