Cod sursa(job #3244109)

Utilizator AlexSerban21Serban Alexandru AlexSerban21 Data 23 septembrie 2024 17:05:22
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
char sir[100002],stiva_semne[100002];
int b,a,i,nr,stiva_nr[100001];
int f (int a,int b,char ch)
{
    if (ch=='+')
        return a+b;
    if (ch=='-')
        return a-b;
    if (ch=='*')
        return a*b;
    return a/b;
}
int val (int ch)
{
    if (ch=='+'||ch=='-')
        return 1; ///scoate doar pe 2
    if (ch=='*'||ch=='/')
        return 2; ///nu scoate nimic
    return 0; /// () poate scoate orice
}
int main ()
{
    ///doua stive, una cu operatori, una cu numere
    fin>>sir;
    for (i=0; sir[i]; i++)
    {
        if (sir[i]=='(')
            stiva_semne[++b]='(';
        else if (sir[i]==')')
        {
            while (stiva_semne[b]!='(')
            {
                stiva_nr[a-1]=f (stiva_nr[a-1],stiva_nr[a],stiva_semne[b]);
                a--;
                b--;
            }
            b--;
        }
        else if (sir[i]>='0'&&sir[i]<='9')
        {
            nr=0;
            while (sir[i]>='0'&&sir[i]<='9')
            {
                nr=nr*10+(sir[i]-'0');
                i++;
            }
            i--;
            stiva_nr[++a]=nr;
        }
        else
        {
            while (val (stiva_semne[b])>=val (sir[i]))
            {
                stiva_nr[a-1]=f (stiva_nr[a-1],stiva_nr[a],stiva_semne[b]);
                a--;
                b--;
            }
            stiva_semne[++b]=sir[i];
        }
    }
    while (b>0)
    {
        stiva_nr[a-1]=f (stiva_nr[a-1],stiva_nr[a],stiva_semne[b]);
        b--;
        a--;
    }
    fout<<stiva_nr[1];
    return 0;
}