[Question du jour] Acwing 3302. Evaluation de l'expression

sujet

Étant donné une expression, où l'opérateur ne contient que +, -, *, / (addition, soustraction, multiplication et division), y compris éventuellement des parenthèses, veuillez trouver la valeur finale de l'expression.

Remarque:

Les données garantissent que l'expression donnée est légale.
Le symbole de garantie de titre apparaît uniquement sous la forme d'un signe moins et non d'un signe moins. Par exemple, des expressions telles que -1 + 2, (2 + 2) * (- (1 + 1) +2) n'apparaissent pas.
Le titre garantit que tous les nombres de l'expression sont des entiers positifs.
Le titre garantit que l'expression ne dépasse pas 231-1 dans le processus de calcul intermédiaire et le résultat.
La division dans la question fait référence à l'arrondissement à 0, ce qui signifie que pour les résultats supérieurs à 0, il est arrondi vers le bas, par exemple, 5/3 = 1, et pour les résultats inférieurs à 0, il est arrondi, par exemple, 5 / (1−4) = - 1.
Divide en C ++ et Java est arrondi à zéro par défaut; Divide en Python // est arrondi par défaut, donc le diviseur dans la fonction eval () de Python est également arrondi vers le bas, ce qui ne peut pas être utilisé directement dans cette question.
Le format d'entrée est
une ligne, qui est une expression donnée.

Le format de sortie est
une ligne, qui est le résultat de l'expression.

Plage de données
La longueur de l'expression ne dépasse pas 105.

Échantillon d'entrée:
(2 + 2) * (1 + 1)
Échantillon de sortie:
8

Idées

Commencez par convertir l'expression de préfixe en une expression de suffixe

  1. S'il s'agit d'un nombre, sortie directement
  2. S'il s'agit d'un opérateur, si l'élément supérieur de la pile est également un opérateur et que la priorité de l'opérateur actuel est inférieure à celle de l'opérateur supérieur et que la pile n'est pas vide, pop l'élément supérieur de la pile et la sortie. Poussez l'opérateur actuel sur la pile.
  3. Si l'élément courant est une expansion à droite:
    1. Si la pile n'est pas vide, pop la pile et la sortie jusqu'à ce qu'elle rencontre la parenthèse gauche
    2. Enfin, si la pile n'est pas vide, pop le nombre large gauche
  4. S'il s'agit d'un nombre large à gauche, poussez directement la pile
  5. Les éléments restants dans la pile de sortie
    // 变为后缀表达式
    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();
    }

Calculer la valeur de l'expression postfix

  1. S'il s'agit d'un nombre, poussez directement la pile
  2. S'il s'agit d'un opérateur, affichez deux nombres, effectuez une opération à gauche avec l'opérateur actuel et poussez le résultat sur la pile
    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();

Je suppose que tu aimes

Origine blog.csdn.net/qq_22473333/article/details/115045266
conseillé
Classement