Informatică, întrebare adresată de printess199, 8 ani în urmă

Cerința
Se consideră o expresie formată din numere naturale, paranteze rotunde și operatorii +, -, *.

Date de intrare
Să se evalueze expresia.

Date de ieșire
Programul va afișa pe ecran un singur număr reprezentând valoarea expresiei.

Restricții și precizări
Lungimea expresiei va fi de cel mult 50 de caractere
Rezultatul final precum și rezultatele intermediare se vor încadra în tipul de date long long.
Expresia este corectă și nu conține alte caractere în afară de cifre și simbolurile +, -, *, (, ).



Exemplu
Intrare

2340-(10+21)*12
Ieșire

1968
Explicație
2340-(10+21)*12 = 2340-31*12 = 2340-372 = 1968


printess199: 3549 pbinfo

Răspunsuri la întrebare

Răspuns de fnaf4460
1

#include <bits/stdc++.h>

using namespace std;

int precedence(char op){

   if(op == '+'||op == '-')

   return 1;

   if(op == '*'||op == '/')

   return 2;

   return 0;

}

int applyOp(int a, int b, char op){

   switch(op){

       case '+': return a + b;

       case '-': return a - b;

       case '*': return a * b;

       case '/': return a / b;

   }

}

int evaluate(string tokens){

   int i;

   stack <int> values;

   stack <char> ops;

   for(i = 0; i < tokens.length(); i++){

       if(tokens[i] == ' ')

           continue;

       else if(tokens[i] == '('){

           ops.push(tokens[i]);

       }

       else if(isdigit(tokens[i])){

           int val = 0;

           while(i < tokens.length() &&

                       isdigit(tokens[i]))

           {

               val = (val*10) + (tokens[i]-'0');

               i++;

           }

           values.push(val);

             i--;

       }

       else if(tokens[i] == ')')

       {

           while(!ops.empty() && ops.top() != '(')

           {

               int val2 = values.top();

               values.pop();

               int val1 = values.top();

               values.pop();

               char op = ops.top();

               ops.pop();

               values.push(applyOp(val1, val2, op));

           }

           if(!ops.empty())

              ops.pop();

       }

       else

       {

           while(!ops.empty() && precedence(ops.top())

                               >= precedence(tokens[i])){

               int val2 = values.top();

               values.pop();

               int val1 = values.top();

               values.pop();

               char op = ops.top();

               ops.pop();

               values.push(applyOp(val1, val2, op));

           }

           ops.push(tokens[i]);

       }

   }

   while(!ops.empty()){

       int val2 = values.top();

       values.pop();

       int val1 = values.top();

       values.pop();

       char op = ops.top();

       ops.pop();

       values.push(applyOp(val1, val2, op));

   }

   return values.top();

}

int main() {

   string s;

   getline(cin, s);

   cout << evaluate(s) << endl;

}

Alte întrebări interesante