Cod sursa(job #2115761)

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

int semn1(char c)
{
    if(c=='+')
        return 1;
    if(c=='-')
        return 1;
    if(c=='*')
        return 2;
    if(c=='/')
        return 2;
    return 0;
}
int semn2(pair<char,int> c)
{
    if(c.first=='+')
        return -1;
    if(c.first=='-')
        return -2;
    if(c.first=='*')
        return -3;
    if(c.first=='/')
        return -4;
    return 0;
}
int nr(int &i)
{
    int c=0;
    while('0'<=s[i] && s[i]<='9')
    {
        c=c*10+s[i]-'0';
        i++;
    }
    return c;
}
int main()
{
    fin>>s;
    int nl=strlen(s);
    int k=0;
    for(int i=0;i<nl;i++)
    {
        if('0'<=s[i]&&s[i]<='9')
            expresie.push(nr(i));
        if(semn1(s[i])>0)
        {
            while(!semn.empty()&&(semn1(s[i])+k<=semn.top().second))
            {
                expresie.push(semn2(semn.top()));
                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()));
        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;
}