Cod sursa(job #2979534)

Utilizator raresgherasaRares Gherasa raresgherasa Data 15 februarie 2023 13:21:07
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");

const int kN = 1e5 + 5;

char stkOp[kN], s[kN];
int stkNumbers[kN], n, op;

void calculate (char ch){
   int a = stkNumbers[stkNumbers[0]];
   --stkNumbers[0];
   int b = stkNumbers[stkNumbers[0]];
   --stkNumbers[0];
   switch (ch){
      case '+' : stkNumbers[++stkNumbers[0]] = a + b; break;
      case '-' : stkNumbers[++stkNumbers[0]] = b - a; break;
      case '*' : stkNumbers[++stkNumbers[0]] = a * b; break;
      case '/' : stkNumbers[++stkNumbers[0]] = b / a; break;
   }
}

int priority (char ch){
   if (ch == '+' || ch == '-'){
      return 1;
   }
   if (ch == '/' || ch == '*'){
      return 2;
   }
   return -1;
}

int main(){
   ios_base::sync_with_stdio(false);

   fin.getline(s, 100001);
   n = (int)strlen(s);
   for (int i = 0; i < n; i++){
      if (isdigit(s[i])){
         int number = 0;
         while (i < n && isdigit(s[i])){
            number = number * 10 + (s[i] - '0');
            ++i;
         }
         stkNumbers[++stkNumbers[0]] = number;
         --i;
      }
      else if (strchr("+-/*", s[i])){
         while (op > 0 && priority(stkOp[op]) >= priority(s[i])){
            calculate(stkOp[op]);
            --op;
         }
         stkOp[++op] = s[i];
      }
      else if (s[i] == '(' || s[i] == ')'){
         if (s[i] == '('){
            stkOp[++op] = s[i];
         }
         else{
            while (stkOp[op] != '('){
               calculate(stkOp[op]);
               --op;
            }
            --op;
         }
      }
   }
   while (op > 0){
      calculate(stkOp[op]);
      --op;
   }
   fout << stkNumbers[stkNumbers[0]];
}