[Pregunta del día] Acwing 3302. Evaluación de la expresión

tema

Dada una expresión, donde el operador solo contiene +, -, *, / (suma, resta, multiplicación y división), posiblemente incluyendo paréntesis, busque el valor final de la expresión.

Nota:

Los datos garantizan que la expresión dada es legal.
El símbolo de garantía de título solo aparece como un signo menos, no como un signo menos. Por ejemplo, expresiones como -1 + 2, (2 + 2) * (- (1 + 1) +2) no aparecerán.
El título garantiza que todos los números de la expresión sean enteros positivos.
El título garantiza que la expresión no exceda de 231-1 en el proceso de cálculo intermedio y el resultado.
La división en la pregunta se refiere al redondeo a 0, lo que significa que para resultados superiores a 0, se redondea hacia abajo, por ejemplo, 5/3 = 1, y para resultados inferiores a 0, se redondea hacia arriba, por ejemplo, 5 / (1−4) = - 1.
Dividir en C ++ y Java se redondea a cero de forma predeterminada; Dividir en Python // se redondea hacia abajo de forma predeterminada, por lo que el divisor en la función eval () de Python también se redondea hacia abajo, lo que no se puede usar directamente en esta pregunta.
El formato de entrada es
una línea, que es una expresión dada.

El formato de salida es
una línea, que es el resultado de la expresión.

Rango de datos
La longitud de la expresión no excede 105.

Muestra de entrada:
(2 + 2) * (1 + 1)
Muestra de salida:
8

Ideas

Primero convierta la expresión de prefijo en una expresión de sufijo

  1. Si es un número, emita directamente
  2. Si es un operador, si el elemento superior de la pila también es un operador y la prioridad del operador actual es menor que la del operador superior y la pila no está vacía, saque el elemento superior de la pila y envíe la salida. Empuje al operador actual sobre la pila.
  3. Si el elemento actual es la expansión derecha:
    1. Si la pila no está vacía, saque la pila y la salida hasta que encuentre el paréntesis izquierdo
    2. Finalmente, si la pila no está vacía, saque el número ancho izquierdo
  4. Si es un número ancho a la izquierda, empuje directamente la pila
  5. Los elementos restantes en la pila de salida
    // 变为后缀表达式
    for (auto iter = expression.begin(); iter != expression.end(); iter++)
    {
    
    
		// 如果是数字,直接输出
    	if (*iter >= '0' && *iter <= '9')
    	{
    
    
    		while (*iter >= '0' && *iter <= '9' && iter != expression.end())
    		{
    
    
    			p_expression.push_back(*iter);
    			iter++;
    		}
    		iter--;
    		p_expression.push_back(' ');
    	}
    	// 如果是运算符,若栈顶元素也是运算符且当前运算符优先级小于栈顶运算符且栈不为空,弹出栈顶元素并输出
    	// 将当前运算符压栈
    	else if (isp(*iter))
        {
    
    
            while ( !s1.empty() && (rankp(*iter) <= rankp(s1.top())) && isp(s1.top()) )
            {
    
    
                p_expression.push_back(s1.top());
                s1.pop();
            }
            s1.push(*iter);
        }
        // 如果当前元素是右扩号:
        // 如果栈不为空,一直弹栈并输出直到遇到左括号
        // 最后若栈不为空,弹出左阔号
        else if (*iter == ')')
        {
    
    
            while (!s1.empty() && s1.top() != '(')
            {
    
    
                p_expression.push_back(s1.top());
                s1.pop();
            }
            
            if (!s1.empty())
                s1.pop();
        }
        // 如果是左阔号,直接压栈
        else if (*iter == '(')
        {
    
    
            s1.push(*iter);
        }
    }
    // 最后输出栈中剩余元素
    while (!s1.empty())
    {
    
    
        p_expression.push_back(s1.top());
        s1.pop();
    }

Calcular el valor de la expresión de sufijo

  1. Si es un número, empuje directamente la pila
  2. Si es un operador, muestre dos números, realice una operación izquierda con el operador actual y envíe el resultado a la pila.
    for (auto iter = p_expression.begin(); iter != p_expression.end(); iter++)
    {
    
    
    	t = "";
        while (*iter >= '0' && *iter <= '9')
        {
    
    
        	t.push_back(*iter++);
        }

        if (t != "")
        	s2.push(atoi(t.c_str()));

        if (*iter != ' ')
        {
    
    
			int num1 = s2.top();
			s2.pop();
			int num2 = s2.top();
			s2.pop();


            if (*iter == '+')
                temp = num2 + num1;
            if (*iter == '-')
                temp = num2 - num1;
            if (*iter == '*')
                temp = num2 * num1;
            if (*iter == '/')
                temp = num2 / num1;
            s2.push(temp);
        }
    }
    if (!s2.empty())
		cout << s2.top();

Supongo que te gusta

Origin blog.csdn.net/qq_22473333/article/details/115045266
Recomendado
Clasificación