Cod sursa(job #2115670)

Utilizator TavinciStefanescu Octavian Tavinci Data 26 ianuarie 2018 23:34:28
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <fstream>
#include <string.h>
#include <stack>
#include <queue>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char s[100001];
int k;
queue <int>expresie;
stack <pair<char,int> >semn;
stack <int>rez;



int semn1(char sem)
{
    if(sem=='+')
        return 1;
    if(sem=='-')
        return 1;
    if(sem=='*')
        return 2;
    if(sem=='/')
        return 2;
    return 0;
}
int semn2(char sem)
{
    if(sem=='+')
        return -1;
    else if(sem=='-')
        return -2;
    else if(sem=='*')
        return -3;
    else if(sem=='/')
        return -4;
    return 0;
}


int main()
{
    fin>>s;
    for(int i=0; i<strlen(s); i++)
    {
        if(isdigit(s[i]))
        {
            int c=0;
            while(isdigit(s[i]))
            {
                c=c*10+s[i]-'0';
                i++;
            }
            expresie.push(c);
        }
        if(semn1(s[i])>0)
        {
            while(!semn.empty()&&(semn1(s[i])+k<=semn.top().second))
            {
                expresie.push(semn2(semn.top().first));
                semn.pop();
            }
            semn.push({s[i],semn1(s[i])+k});
        }
        if(s[i]=='(')
            k+=2;
        if(s[i]==')')
            k-=2;
    }
    while(!semn.empty())
    {
        expresie.push(semn2(semn.top().first));
        semn.pop();
    }
    while(!expresie.empty())
    {
        if(expresie.front()>=0)
        {
            rez.push(expresie.front());
            expresie.pop();
        }
        else
        {
            int a=rez.top();
            rez.pop();
            int b=rez.top();
            rez.pop();
            if(expresie.front()==-1)
                rez.push(b+a);
            if(expresie.front()==-2)
                rez.push(b-a);
            if(expresie.front()==-3)
                rez.push(b*a);
            if(expresie.front()==-4)
                rez.push(b/a);
            expresie.pop();
        }
    }
    fout<<rez.top();
    return 0;
}