Cod sursa(job #1465305)

Utilizator doruliqueDoru MODRISAN dorulique Data 26 iulie 2015 23:05:50
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.1 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

#define vmax 100001

int stv[vmax],vfsv=-1,vfso=-1;
char sto[vmax];

int pr(char c)
{
    if(c=='(')return 0;
    if(c=='+'||c=='-')return 1;
    if(c=='*'||c=='/'||c=='%')return 2;
    if(c=='m'||c=='+')return 3;
    return -1;
}

int main()
{
    char s[vmax+2];
    fstream f("evaluare.in",ios::in);
    f.getline(s+1,vmax);
    s[0]='(';strcat(s,")");
    int i,n=strlen(s);
    for(i=0;i<n;i++)
    {
        if(s[i]=='(')sto[++vfso]='(';
        else
        if(isdigit(s[i]))
            if(!isdigit(s[i-1]))
                        stv[++vfsv]=s[i]-'0';
            else
                stv[vfsv]=stv[vfsv]*10+s[i]-'0';
        else
        {
            if(s[i]=='-'&&(s[i-1]=='('||pr(s[i-1])>0))
                sto[++vfso]='m';
            else
                if(s[i]=='+'&&(s[i-1]=='('||pr(s[i-1])>0))
                    sto[++vfso]='p';
                else
                    if(pr(s[i])>0||s[i]==')')sto[++vfso]=s[i];
            if(sto[vfso]==')')
            {
                vfso--;
                while(sto[vfso]!='(')
                        {
                            if(sto[vfso]=='m')stv[vfsv]*=-1;
                            else if(sto[vfso]=='/')
                                {stv[vfsv-1]=stv[vfsv-1]/stv[vfsv];vfsv--;}
                            else if(sto[vfso]=='%')
                                {stv[vfsv-1]=stv[vfsv-1]%stv[vfsv];vfsv--;}
                            else if(sto[vfso]=='*')
                                {stv[vfsv-1]=stv[vfsv-1]*stv[vfsv];vfsv--;}
                            else if(sto[vfso]=='+')
                                {stv[vfsv-1]=stv[vfsv-1]+stv[vfsv];vfsv--;}
                            else if(sto[vfso]=='-')
                                {stv[vfsv-1]=stv[vfsv-1]-stv[vfsv];vfsv--;}
                            vfso--;
                        }
                vfso--;
            }
            else
                if(vfso&&pr(sto[vfso])&&pr(sto[vfso])<=pr(sto[vfso-1]))
                {
                    char op=sto[vfso--];
                    while(pr(op)<=pr(sto[vfso]))
                    {
                            if(sto[vfso]=='m')stv[vfsv]*=-1;
                            else if(sto[vfso]=='/')
                                {stv[vfsv-1]=stv[vfsv-1]/stv[vfsv];vfsv--;}
                            else if(sto[vfso]=='%')
                                {stv[vfsv-1]=stv[vfsv-1]%stv[vfsv];vfsv--;}
                            else if(sto[vfso]=='*')
                                {stv[vfsv-1]=stv[vfsv-1]*stv[vfsv];vfsv--;}
                            else if(sto[vfso]=='+')
                                {stv[vfsv-1]=stv[vfsv-1]+stv[vfsv];vfsv--;}
                            else if(sto[vfso]=='-')
                                {stv[vfsv-1]=stv[vfsv-1]-stv[vfsv];vfsv--;}
                            vfso--;
                    }
                    sto[++vfso]=op;
                }
        }
    }
    f.close();
    f.open("evaluare.out",ios::out);
    f<<stv[0];
    return 0;
}