Cod sursa(job #1652416)

Utilizator pickleVictor Andrei pickle Data 14 martie 2016 22:45:55
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <algorithm>
#include <bitset>
#include <cmath>
#include <fstream>
#include <iostream>
#include <queue>
#include <stack>
#include <string.h>
#include <string>
#include <vector>

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");

inline int perform(int a, int b, int c) {
  switch(c) {
    case '+': return a+b;
    case '-': return a-b;
    case '*': return a*b;
    case '/': return a/b;
    default: return 0;
  }
}
inline int prec(char x) {
  if (x == '(' || x == ')')
    return 0;
  else if (x == '-' || x == '+')
    return 1;
  else
    return 2;
}
int num = -1;
string A;

int main() {
  fin >> A;

  queue<int> Q;  // output
  stack<char> S; // operator stack
  for(size_t i = 0; i < A.size(); ++i) {
    if ('0' <= A[i] && A[i] <= '9') {
      if (num < 0)
        num = 0;
      num = num * 10 + A[i] - '0';
    }
    else {
      if (num >= 0)
        Q.push(num), num = -1;
      switch(A[i]) {
        case '(': S.push('(');
                  break;
        case ')': while(S.top() != '(') {
                    Q.push(-int(S.top()));
                    S.pop();
                  }
                  S.pop();
                  break;
        case '-':
        case '+': while(!S.empty() && prec(S.top()) >= 1) {
                    Q.push(-int(S.top()));
                    S.pop();
                  }
                  S.push(A[i]);
                  break;
        case '*':
        case '/': while(!S.empty() && prec(S.top()) >= 2) {
                    Q.push(-int(S.top()));
                    S.pop();
                  }
                  S.push(A[i]);
                  break;
      }
    }
  }
  if (num >= 0)
    Q.push(num), num = -1;
  while(!S.empty()) {
    Q.push(-int(S.top()));
    S.pop();
  }

  stack<int> R;
  while(!Q.empty()) {
    if(Q.front() >= 0) {
      R.push(Q.front());
      Q.pop();
    } else {
      char c = -Q.front();
      Q.pop();
      int b = R.top(); R.pop();
      int a = R.top(); R.pop();
      R.push(perform(a, b, c));
    }
  }

  fout << R.top() << endl;

  return 0;
}