Cod sursa(job #3000721)

Utilizator danyyyDaniel danyyy Data 12 martie 2023 19:38:17
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.16 kb

#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char s[100001];
int pol[100001];
stack<char>Q;
stack<int>Q2;
int main()
{
    fin>>s;
    int l=strlen(s),i,nr=0,vf=0,a,b;
    for(i=0; i<l; i++)
    {
        if(s[i]>='0' && s[i]<='9')nr=nr*10+int(s[i]-'0');
        else
        {
            if(s[i-1]>='0' && s[i-1]<='9')
            {
                vf++;
                pol[vf]=nr;
                nr=0;
            }
            if(s[i]=='(')
            {
                Q.push(s[i]);
            }
            else if(s[i]==')')
            {
                while(Q.top()!='(')
                {
                    vf++;
                    if(Q.top()=='+')pol[vf]=-1;
                    else if(Q.top()=='-')pol[vf]=-2;
                    else if(Q.top()=='/')pol[vf]=-3;
                    else pol[vf]=-4;
                    Q.pop();
                }
                Q.pop();
            }
            else if(s[i]=='-' || s[i]=='+')
            {
                while(Q.empty()==0 && Q.top()!='(')
                {
                    vf++;
                    if(Q.top()=='+')pol[vf]=-1;
                    else if(Q.top()=='-')pol[vf]=-2;
                    else if(Q.top()=='/')pol[vf]=-3;
                    else pol[vf]=-4;
                    Q.pop();
                }
                Q.push(s[i]);
            }
            else
            {
                while(Q.empty()==0 && Q.top()!='+' && Q.top()!='-' && Q.top()!='(')
                {
                    vf++;
                    if(Q.top()=='/')pol[vf]=-3;
                    else pol[vf]=-4;
                    Q.pop();
                }
                Q.push(s[i]);
            }
        }
    }
    vf++;
    pol[vf]=nr;
    while(Q.empty()==0)
    {
        vf++;
        if(Q.top()=='+')pol[vf]=-1;
        else if(Q.top()=='-')pol[vf]=-2;
        else if(Q.top()=='/')pol[vf]=-3;
        else pol[vf]=-4;
        Q.pop();
    }
    for(i=1;i<=vf;i++)fout<<pol[i]<< ' ';
    fout<<endl;
    for(i=1;i<=vf;i++)
    {
        Q2.push(pol[i]);
            if(Q2.top()<0)
        {
            if(Q2.top()==-1)
            {
                Q2.pop();
                a=Q2.top();
                Q2.pop();
                b=Q2.top();
                Q2.pop();
                Q2.push((a+b)%1000000000);
            }
          else if(Q2.top()==-2)
            {
                Q2.pop();
                a=Q2.top();
                Q2.pop();
                b=Q2.top();
                Q2.pop();
                Q2.push((b-a)%1000000000);
            }
           else if(Q2.top()==-3)
            {
                Q2.pop();
                a=Q2.top();
                Q2.pop();
                b=Q2.top();
                Q2.pop();
                Q2.push((b/a)%1000000000);
            }
            else
            {
                Q2.pop();
                a=Q2.top();
                Q2.pop();
                b=Q2.top();
                Q2.pop();
                Q2.push((a*b)%1000000000);
            }
        }
    }
    fout<<Q2.top();
}