Cod sursa(job #2112170)

Utilizator sergiudnyTritean Sergiu sergiudny Data 23 ianuarie 2018 09:51:45
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <bits/stdc++.h>
#define pb push_back
#define INF 0x3f3f3f
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

stack<int>pol,op,val;
string v;

int calc(int a, int b, int semn){
    if(semn==-1) return a+b;
    if(semn==-2) return a-b;
    if(semn==-3) return a*b;
    if(semn==-4) return a/b;
}

int isOperator(char a){
    if(a=='+') return -1;
    if(a=='-') return -2;
    if(a=='*') return -3;
    if(a=='/') return -4;
    return 0;
}

inline int priority(int a){ return abs(a);}

bool isDigit(char a){
    int aux = int(a-'0');
    return (aux>=0 && aux<=9);
}

void parse(int &i){
    int ans=0;
    for(;i<v.size() && isDigit(v[i]);++i){
        ans=ans*10+int(v[i]-'0');
    }
    pol.push(ans); i--;
}

void clearOp(bool close){
    while(!op.empty()){
        if(op.top() == INF){
            if(close) op.pop();
            return;
        }
        pol.push(op.top());
        op.pop();
    }
}

void makePol(){
    for(int i=0;i<v.size();++i){
        if(v[i]=='(') op.push(INF);
        else if(v[i]==')') clearOp(1);
        else if(isOperator(v[i])){
            while(!op.empty() && op.top()!=INF && priority(isOperator(v[i]))<priority(op.top())){
                pol.push(op.top()); op.pop();
            }
            op.push(isOperator(v[i]));
        }
        else if(isDigit(v[i])) parse(i);
    }
    clearOp(0);
}

int getAns(){
    int semn = pol.top(); pol.pop();
    if(semn>0) return semn;
    int op1=-1, op2=-1;
    while(op1==-1 || op2==-1){
        if(pol.top()>0){
            if(op2==-1) op2=pol.top();
            else op1=pol.top();
            pol.pop();
        } else {
            if(op2==-1) op2=getAns();
            else if(op1==-1) op1=getAns();
        }
    }
    cout<<op1<<" "<<op2<<" "<<semn<<'\n';
    return calc(op1,op2,semn);
}

int main()
{
    fin>>v;
    makePol();
    fout<<getAns();
    return 0;
}