Cod sursa(job #3342172)

Utilizator LucaMirsolea14Luca Mirsolea LucaMirsolea14 Data 23 februarie 2026 11:30:42
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.77 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

string s;
stack<char> st_op;
stack<int> st_nr;

int prioritate[260];

int32_t main(){

    prioritate['+'] = prioritate['-'] = 1;
    prioritate['*'] = prioritate['/'] = 2;

    int i, nr, j,a, b, ans=0, n;
    char op;

    fin >> s;

    n = s.size();

    for(i=0;i<n;i++){

     /*   stack<int> st1 = st_nr;
        stack<char> st2 = st_op;

        while(!st1.empty()){
            fout << st1.top() << " " ;
            st1.pop();
        }
        fout << endl;
        while(!st2.empty()){
            fout << st2.top() << " " ;
            st2.pop();
        }
        fout << endl << endl;*/


        if(s[i] == '('){
            st_op.push('(');
            continue;
        }
        if(isdigit(s[i])){
            nr=0;
            for(j=i;j<n&&isdigit(s[j]);j++)
                nr = nr * 10 + (s[j]-'0');
            i = j-1;
            st_nr.push(nr);
            continue;
        }
        if(s[i] == ')'){
            while(st_op.top() != '('){
                a = st_nr.top();
                st_nr.pop();
                b = st_nr.top();
                st_nr.pop();
                op = st_op.top();
                st_op.pop();

                if(op == '*')
                    nr = b*a;
                if(op == '/')
                    nr = b/a;
                if(op == '-')
                    nr = b-a;
                if(op == '+')
                    nr = b+a;
                st_nr.push(nr);

            }
            st_op.pop(); /// (
            continue;
        }
        while(!st_op.empty() && prioritate[st_op.top()] >= prioritate[s[i]]){
           a = st_nr.top();
                st_nr.pop();
                b = st_nr.top();
                st_nr.pop();
                op = st_op.top();
                st_op.pop();

                if(op == '*')
                    nr = b*a;
                if(op == '/')
                    nr = b/a;
                if(op == '-')
                    nr = b-a;
                if(op == '+')
                    nr = b+a;
            st_nr.push(nr);

        }
        st_op.push(s[i]);

    }


        while(!st_op.empty()){
            a = st_nr.top();
                st_nr.pop();
                b = st_nr.top();
                st_nr.pop();
                op = st_op.top();
                st_op.pop();

                if(op == '*')
                    nr = b*a;
                if(op == '/')
                    nr = b/a;
                if(op == '-')
                    nr = b-a;
                if(op == '+')
                    nr = b+a;
            st_nr.push(nr);

        }

        fout << st_nr.top();

}