Cod sursa(job #1885825)

Utilizator raisacmtAxenie Raisa raisacmt Data 20 februarie 2017 13:43:52
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <cstdio>
#include<cstring>
#include<cctype>
using namespace std;
char op[100005],s[100005];
int v[100005],top,top2;
int priority(char op)
{
    int rez;
    if(op=='+')
    rez=1;
    if(op=='-')
        rez=1;
    if(op=='*')
    rez=2;
    if(op=='/')
    rez=2;

    return rez;
}
int calc(int a,int top)
{
    int rez;
    if(op[top]=='+')
    rez=v[a-1]+v[a];
    if(op[top]=='-')
        rez=v[a-1]-v[a];
    if(op[top]=='*')
    rez=v[a-1]*v[a];
    if(op[top]=='/')
    rez=v[a-1]/v[a];

    return rez;
}

int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    int n,i,nr;
    gets(s);
    n=strlen(s);
    for(i=0; i<n; i++)
    {
        if(s[i]=='(')
            op[++top]=s[i];
            else
        if(s[i]==')'){
            while(op[top]!='('){

                v[top2-1]=calc(top2,top);

                top--;
                top2--;
            }
        }
        else
            if(isdigit(s[i]))
        {
            nr=s[i]-'0';
            i++;
            while(isdigit(s[i]))
            {
                nr*=10;
                nr+=(s[i]-'0');
                i++;
            }
            i--;
            v[++top2]=nr;
        }
        else
            if(op[top]=='(' || priority(s[i])>priority(op[top]))
               op[++top]=s[i];
        else

        if(priority(s[i])<=priority(op[top])){
            while(priority(s[i])<=priority(s[i-1]) && op[top]!='(' && top>=0){

                v[top2-1]=calc(top2,top);

                top--;
                top2--;
            }

        op[++top]=s[i];
        }


    }
    while(top>=0)
        {

                v[top2-1]=calc(top2,top);

                top--;
                top2--;
        }
    printf("%d",v[top2]);
    return 0;
}