Cod sursa(job #2228818)

Utilizator bojemoiRadu Mamaliga bojemoi Data 4 august 2018 22:58:15
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.94 kb
#include<fstream>
#include<string.h>
#include<vector>
using namespace std;

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

string postf, inf;
int n, m;
char w;
vector<char>stivcik;

long evaluare(){
    vector<long> stiva;
    long num;
    int i = 0;
    while(i<n){
        while(postf[i]==' ' || postf[i]=='\t') ++i;
        if(postf[i]>47 && postf[i]<58){
            num = 0;
            while(i<n && postf[i]>47 && postf[i]<58){
                num*=10;
                num+=(postf[i]-48);
                ++i;
            }
            stiva.push_back(num);
        }
        if(postf[i]=='+'){
            long op1 = stiva.back();
            stiva.pop_back();
            long op2 = stiva.back();
            stiva.pop_back();
            stiva.push_back(op1+op2);
            i++;
        }
        if(postf[i]=='*'){
            long op1 = stiva.back();
            stiva.pop_back();
            long op2 = stiva.back();
            stiva.pop_back();
            stiva.push_back(op1*op2);
            i++;
        }
        if(postf[i]=='-'){
            long op1 = stiva.back();
            stiva.pop_back();
            long op2 = stiva.back();
            stiva.pop_back();
            stiva.push_back(op2-op1);
            i++;
        }
        if(postf[i]=='/'){
            long op1 = stiva.back();
            stiva.pop_back();
            long op2 = stiva.back();
            stiva.pop_back();
            stiva.push_back(op2/op1);
            i++;
        }
}
    return stiva.back();

}

int imp(char s){
    if(s=='(') return 0;
    if(s == '+' || s=='-') return 1;
    return 2;
}

void conversie(){
    int i = 0;
    n = 0;
    while(i<m){
        w = inf[i];
        if(w>47 && w<58){
            postf[n++] = inf[i];
            if(inf[i+1]<48 || inf[i+1]>57){ postf[n++] = ' ';}
        }
        else if(w=='('){
            stivcik.push_back('(');
           }
        else if(w==')'){
            char aux = stivcik.back();
            while(aux!='('){
                        postf[n++] = aux;
                        postf[n++] = ' ';
                        stivcik.pop_back();
                        aux = stivcik.back();
                  }
                  stivcik.pop_back();

        }
        else{
            if(stivcik.empty()) stivcik.push_back(w);
            else{
                while(!stivcik.empty() && imp(stivcik.back())>imp(w)){
                        postf[n++] = stivcik.back();
                        postf[n++] = ' ';
                        stivcik.pop_back();
                }
                stivcik.push_back(w);
            }
        }
        i++;
    }
    while(!stivcik.empty()){
        postf[n++] = stivcik.back();
        postf[n++] = ' ';
        stivcik.pop_back();
    }
}



int main ()
{
    getline(fin,inf);
    m = inf.size();

    conversie();
    fout<<evaluare();


  return 0;
}