Cod sursa(job #2264496)

Utilizator Katherine456719Swan Katherine Katherine456719 Data 20 octombrie 2018 10:02:44
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.49 kb
#include <iostream>
#include <fstream>
#include <cctype>
#include <cstring>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
const int NMAX=100001;
int pr(char c)
{
    switch(c)
    {
    case '+':
        return 1;
    case '-':
        return 1;
    case '*':
        return 2;
    case '/':
        return 3;
      default :
        return 0;
    }
}
int main()
{
    char op[NMAX/2+5],c;
    long int val[NMAX/2+5],top=0,top1=0,nr=0,n;
    char s[NMAX+5];
    f.getline(s,NMAX+5);
    n=strlen(s);
    int i=0;
    while(i<n)
    {
        if(isdigit(s[i]))
        {
            while(isdigit(s[i]) && i<n)
            {
                nr=nr*10+(s[i]-'0');
                i++;
            }
            val[++top1]=nr;
            nr=0;
            i--;
        }
        else
        {
            if(s[i]==')')
            {
                while(op[top]!='(' && top>0)
                {
                    switch(op[top])
                    {
                    case '+':
                    {
                        val[top1-1]+=val[top1];
                        break;
                    }
                    case '-':
                    {
                        val[top1-1]-=val[top1];
                        break;
                    }
                    case '*' :
                    {
                        val[top1-1]*=val[top1];
                        break;
                    }
                    case '/':
                    {
                        val[top1-1]/=val[top1];
                        break;
                    }
                    }
                    top--;
                    top1--;
                }
                top--;
            }
            else if((pr(s[i])>pr(op[top])) || top==0 || op[top]=='(')
                op[++top]=s[i];
            else
            {
                while(top>0 && pr(s[i])<=op[top])
                {
                    switch(op[top])
                    {
                    case '+':
                    {
                        val[top1-1]+=val[top1];

                        break;
                    }
                    case '-':
                    {
                        val[top1-1]-=val[top1];
                        break;
                    }
                    case '*' :
                    {
                        val[top1-1]*=val[top1];
                        break;
                    }
                    case '/':
                    {
                        val[top1-1]/=val[top1];
                        break;
                    }
                    }
                    top1--;
                    top--;

                }
                op[++top]=s[i];
            }
        }
        i++;
    }
    if(i==n)
    {
        while(top>0)
        {
            switch(op[top])
            {
            case '+':
            {
                val[top1-1]+=val[top1];

                break;
            }
            case '-':
            {
                val[top1-1]-=val[top1];
                break;
            }
            case '*' :
            {
                val[top1-1]*=val[top1];
                break;
            }
            case '/':
            {
                val[top1-1]/=val[top1];
                break;
            }
            }
            top1--;
            top--;
        }
    }
    g<<val[top1];
    return 0;
}