Cod sursa(job #2263933)

Utilizator Katherine456719Swan Katherine Katherine456719 Data 19 octombrie 2018 16:52:23
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.64 kb
#include <iostream>
#include <fstream>
#include <cctype>
#include <cstring>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
const int NMAX=100001;
int pr(char c) {
  switch(c) {
  case '+':
    return 1;
  case '-':
    return 1;
  case '*':
    return 2;
  case '/':
    return 3;
  }
}
int main() {
  char op[NMAX/2+5],c;
  long int val[NMAX/2+5],top=0,top1=0,nr=0,n;
  char s[NMAX+5];
  f.getline(s,NMAX+5);
  n=strlen(s);
  int i=0;
  while(i<n) {
    if(isdigit(s[i])) {
      while(isdigit(s[i]) && i<n) {
        nr=nr*10+(s[i]-'0');
        i++;
      }
      val[++top1]=nr;
      nr=0;
      i--;
    } else {
      if(s[i]==')') {
        while(op[top]!='(' && top>0) {
          switch(op[top]) {
          case '+': {
            val[top1-1]=val[top1]+val[top1-1];
            top1--;
            break;
          }
          case '-': {
            val[top1-1]=val[top1]-val[top1-1];
            top1--;
            break;
          }
          case '*' : {
            val[top1-1]=val[top1]*val[top1-1];
            top1--;
            break;
          }
          case '/': {
            val[top1-1]=val[top1]/val[top1-1];
            top1--;
            break;
          }
          }
          op[top--]=NULL;
        }
        op[top--]=NULL;
      } else if((pr(s[i])>pr(op[top])) || top==0 || op[top]=='(')
        op[++top]=s[i];
      else {
        while(top>0 && pr(s[i])<=op[top]) {
          switch(op[top]) {
          case '+': {
            val[top1-1]=val[top1-1]+val[top1];
            top1--;
            break;
          }
          case '-': {
            val[top1-1]=val[top1-1]-val[top1];
            top1--;
            break;
          }
          case '*' : {
            val[top1-1]=val[top1-1]*val[top1];
            top1--;
            break;
          }
          case '/': {
            val[top1-1]=val[top1-1]/val[top1];
            top1--;
            break;
          }
          }
          op[top--]=NULL;

        }
        op[++top]=s[i];
      }
    }
    i++;
  }
  if(i==n) {
    while(top>0) {
      switch(op[top]) {
      case '+': {
        val[top1-1]=val[top1-1]+val[top1];
        top1--;
        break;
      }
      case '-': {
        val[top1-1]=val[top1-1]-val[top1];
        top1--;
        break;
      }
      case '*' : {
        val[top1-1]=val[top1-1]*val[top1];
        top1--;
        break;
      }
      case '/': {
        val[top1-1]=val[top1-1]/val[top1];
        top1--;
        break;
      }
      }
      op[top--]=NULL;
    }
  }
  cout<<val[top1];
  return 0;
}