Cod sursa(job #3274982)

Utilizator Tudor_CCTudor Cocu Tudor_CC Data 8 februarie 2025 16:58:02
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.61 kb
#include <bits/stdc++.h>

using namespace std;

int ev(char cr)
{
    if(cr=='+' || cr=='-')
    {
        return 2;
    }
    else if(cr=='*' || cr=='/')
    {
        return 3;
    }
    else if(cr=='(')
    {
        return 1;
    }
}

char cr[100055];

stack <char> s;

string r;

vector <long long int> v;

int main()
{
    ifstream cin("evaluare.in");
    ofstream cout("evaluare.out");
    cin>>cr;
    int l=strlen(cr);
    for(int i=0;i<l;++i)
    {
        if(cr[i]=='+' || cr[i]=='-' || cr[i]=='*' || cr[i]=='/')
        {
            while(s.empty()==0 && ev(s.top())>=ev(cr[i]))
            {
                r+=s.top();
                s.pop();
            }
            s.push(cr[i]);
        }
        else if(cr[i]=='(')
        {
            s.push(cr[i]);
        }
        else if(cr[i]==')')
        {
            while(s.empty()==0 && s.top()!='(')
            {
                r+=s.top();
                s.pop();
            }
            s.pop();
        }
        else
        {
            while(cr[i]>='0' && cr[i]<='9' && i<l)
            {
                r+=cr[i];
                ++i;
            }
            r+=" ";
            i--;
        }
    }
    while(s.empty()==0)
    {
        r+=s.top();
        s.pop();
    }
    //cout<<r<<"    ";
    long long int nr=0,c;
    for(int i=0;i<r.size();++i)
    {
        if(r[i]>='0' && r[i]<='9')
        {
            while(r[i]>='0' && r[i]<='9' && i<r.size())
            {
                nr=nr*10+int(r[i])-48;
                ++i;
            }
            --i;
            v.push_back(nr);
            nr=0;
        }
        else
        {
            int nr=0;
            //cout<<v[v.size()-1]<<" "<<v[v.size()-2]<<"    ";
            if(r[i]=='+')
            {
                nr=v[v.size()-1]+v[v.size()-2];
                v.pop_back();
                v.pop_back();
                v.push_back(nr);
            }
            if(r[i]=='-')
            {
                nr=v[v.size()-2]-v[v.size()-1];
                v.pop_back();
                v.pop_back();
                v.push_back(nr);
            }
            if(r[i]=='*')
            {
                nr=v[v.size()-1]*v[v.size()-2];
                v.pop_back();
                v.pop_back();
                v.push_back(nr);
            }
            if(r[i]=='/')
            {
                nr=v[v.size()-2]/v[v.size()-1];
                v.pop_back();
                v.pop_back();
                v.push_back(nr);
            }
        }
    }
    cout<<v[0];
    return 0;
}