Cod sursa(job #2220746)

Utilizator AndreiOffCovaci Andrei-Ion AndreiOff Data 12 iulie 2018 14:32:51
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.58 kb
#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>
#include <deque>

using namespace std;

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

char s[100005];

int x, n;

vector<char> st;

deque<int> numere;

deque<char> caractere;

vector<int> rez;

void calculate(char ch){

    int b = -1, y = -1, z = 1;

        b = rez.back();
        rez.pop_back();

        y = rez.back();
        rez.pop_back();



    if(x != -1 && y != -1){

        switch(ch){

        case '^':
            while(b){

                if(b % 2) z *= y;
                else {

                    y *= y;
                    b /= 2;

                }

            }

            break;

        case '*':
            z = y*b;
            break;

        case '/':
            z = y/b;
            break;

        case '+':
            z = y + b;
            break;

        case '-':
            z = y - x;
            break;

        default : break;

        }
    }

    rez.push_back(z);

}

int grade(char ch){

    switch(ch){

        case '^': return 4;
        case '/': return 3;
        case '*': return 3;
        case '-': return 2;
        case '+': return 2;
        default: break;

    }

    return 0;

}

int main()
{

f.getline(s, 100005);

n = strlen(s);

for(int i = 0; i < n; i++){

    while(s[i] >= '0' && s[i] <= '9' && i < n){

        x = x*10 + (s[i] - '0');
        i++;

    }

    if(x){

        i--;

        caractere.push_back('n');
        numere.push_back(x);

        x = 0;

    }else{

        while(!st.empty() && st.back() != '(' && (grade(st.back()) > grade(s[i]) || (grade(st.back()) == grade(s[i]) && st.back() != '^'))){

                caractere.push_back(st.back());

                st.pop_back();

              }


        if(s[i] == '(')
            st.push_back(s[i]);

        else if(s[i] == ')'){

            while(st.back() != '('){

                     caractere.push_back(st.back());

                    st.pop_back();

                  }

            st.pop_back();

        }else st.push_back(s[i]);

    }


}

while(!st.empty()){

     caractere.push_back(st.back());

    st.pop_back();

}

while(!caractere.empty()){

    if(caractere.front() == 'n'){

        rez.push_back(numere.front());
        numere.pop_front();
        caractere.pop_front();

    }else{

        calculate(caractere.front());
        caractere.pop_front();

    }

}

g<<rez.back();

    return 0;
}