Cod sursa(job #3284315)

Utilizator mihaigeorgescuGeorgescu Mihai mihaigeorgescu Data 11 martie 2025 14:08:26
Problema Evaluarea unei expresii Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fcin("evaluare.in");
ofstream fout("evaluare.out");
string s;
int vf,i;
struct elem
{
    int val;
    char semn;
};
elem stv[101001];
inline int priority(char x)
{
    if(x=='0') return 0;
    if(x=='+' || x=='-') return 1;
    if(x=='*' || x=='/') return 2;
}
inline void golire(char x)
{
    while(vf>1 && stv[vf-1].val!=-(1<<30) && priority(stv[vf].semn)>=priority(x))
    {
        if(stv[vf].semn=='+') stv[vf-1].val+=stv[vf].val;
        if(stv[vf].semn=='*') stv[vf-1].val*=stv[vf].val;
        if(stv[vf].semn=='-') stv[vf-1].val-=stv[vf].val;
        if(stv[vf].semn=='/') stv[vf-1].val/=stv[vf].val;
        vf--;
    }
}
int main()
{
    fcin>>s;
    while(i<s.size())
    {
        if(s[i]=='(')
        {
            char p;
            if(i-1==-1 || i-1=='(') p='+'; else p=s[i-1];
            stv[++vf]={-(1<<30),p};
        }
        else if(s[i]==')')
        {
            golire('0');
            stv[vf-1].val=stv[vf].val;
            vf--;
            if(i+1<s.size() && s[i+1]!=')')
            golire(s[i+1]);
        }
        else if(isdigit(s[i]))
        {
            char p;
            if(i-1==-1 || i-1=='(') p='+'; else p=s[i-1];
            int val=0;
            while(i<s.size() && isdigit(s[i])) val=val*10 +s[i]-48, i++; i--;
            stv[++vf]={val,p};
            if(i+1<s.size() && s[i+1]!=')')
            golire(s[i+1]);
        }
        i++;
    }
    golire('0');
    fout<<stv[1].val;
    return 0;
}