Cod sursa(job #2680748)

Utilizator Xutzu358Ignat Alex Xutzu358 Data 4 decembrie 2020 11:38:19
Problema Evaluarea unei expresii Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.16 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");

stack < char > ops;
vector < int > v;
char s[100005];
int aa;
int priority[505];
char ch;
int no[505];
int chars[505];
stack < int > numb;

void operand(char ch) {
    if (priority[ch]==1) {
        ops.push(ch);
    }
    else if (priority[ch]==2) {
        ops.push(ch);
    }
    else if (priority[ch]==3) {
        while (ops.empty()==0 && priority[ops.top()]==2) {
            v.push_back(no[ops.top()]);
            ops.pop();
        }
        ops.push(ch);
    }
    else {
        while (ops.empty()==0 && ops.top()!='(') {
            v.push_back(no[ops.top()]);
            ops.pop();
        }
        ops.pop();
    }
}

int calculate(int a, int b, int op) {
    if (op == -3) {
        return a*b;
    }
    else if (op == -4) {
        return a/b;
    }
    else if (op == -5) {
        return a+b;
    }
    else {
        return a-b;
    }
}

void number_and_priority_init() {
    priority['('] = 1;
    priority['*'] = priority['/'] = 2;
    priority['+'] = priority['-'] = 3;
    priority[')'] = 4;
    no['(']=-1; chars[1]='(';
    no[')']=-2; chars[2]=')';
    no['*']=-3; chars[3]='*';
    no['/']=-4; chars[4]='/';
    no['+']=-5; chars[5]='+';
    no['-']=-6; chars[6]='-';
}

int main()
{
    f >> s;
    ch = s[aa];
    number_and_priority_init();
    while (ch!='\0') {
        if (isdigit(ch)!=0) {
            int nr = 0;
            while (isdigit(ch)!=0) {
                nr = nr*10 + (ch-'0');
                ch = s[++aa];
            }
            v.push_back(nr);
        }
        else {
            operand(ch);
            ch = s[++aa];
        }
    }
   while (ops.empty()==0) {
        v.push_back(no[ops.top()]);
        ops.pop();
   }
   for (int i=0;i<v.size();i++) {
        if (v[i]>=0) {
            numb.push(v[i]);
        }
        else {
            int nr1 = numb.top();
            numb.pop();
            int nr2 = numb.top();
            numb.pop();
            numb.push(calculate(nr2,nr1,v[i]));
        }
   }
   g << numb.top();
    return 0;
}