Evaluación de la expresión de P1981 (Logu)

Portal de título original

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Idea: Primero defina una pila de tipo int y una pila de tipo char para almacenar los operandos y operadores respectivamente, y luego convierta los datos de entrada en la pila de tipo int, y almacene los operadores en la pila de tipo char, si es vacío La pila se puede empujar directamente. Si no está vacía, se debe considerar la prioridad del operador. (El código ASCII de '*' es 74, el código ASCII de '+' es 75 y el signo de multiplicación tiene un prioridad más alta, por lo que si es un signo más Para pilas avanzadas, el signo de multiplicación se puede insertar en la pila, y viceversa), y luego los operandos en la pila de tipos int se lanzan a los dos últimos y luego se realiza la operación , y luego el símbolo de la operación y el resultado de la operación se empujan a la pila para recorrer en bucle la cadena de entrada; el siguiente paso es hacer estallar, operar y empujar la pila no vacía, y finalmente sacar el elemento superior de la pila.

Referencia de código

#include<bits/stdc++.h>
using namespace std;
stack<int> num;//操作数
stack<char> a;//运算符
string str;
int sum=0,t,t1,t2;//t,t1,t2均为临时变量
int main()
{
    
    
    cin>>str;
    for(int i = 0;i < str.length();i++)
    {
    
    
        //转换数据后存入int型栈中
        if(str[i] >= '0' && str[i] <= '9')
        {
    
    
            if(str[i+1] >= '0' && str[i+1] <= '9')
                sum=sum*10+str[i]-'0';
            else
            {
    
    
                sum=(sum*10+str[i]-'0')%10000;   //取后四位即可
                num.push(sum);
                sum=0;
            }
        }
        //将运算符存入char型栈中
        if(str[i] < '0')
        {
    
    
            if(a.empty())
                a.push(str[i]);
            else
            {
    
    
                if(str[i] < a.top())//*小,+大(考虑到运算符的优先级,同级也不行)
                    a.push(str[i]);
                else
                {
    
    
                    t1=num.top();num.pop();
                    t2=num.top();num.pop();
                    if(a.top()=='*')
                        t=(t1*t2)%10000;
                    else
                        t=(t1+t2)%10000;
                    a.pop();
                    a.push(str[i]);
                    num.push(t);
                }
            }
        }
    }
    while(!a.empty())
    {
    
    
        t1=num.top();num.pop();
        t2=num.top();num.pop();
        char x=a.top();a.pop();
        if(x=='+')
        {
    
    
            t=(t1+t2)%10000;
            num.push(t);
        }
        else
        {
    
    
            t=(t1*t2)%10000;
            num.push(t);
        }
    }
    cout<<num.top()<<endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/Bertil/article/details/106794273
Recomendado
Clasificación