Cod sursa(job #2861978)

Utilizator RobertuRobert Udrea Robertu Data 4 martie 2022 18:56:13
Problema Evaluarea unei expresii Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.81 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

struct Numar {
    char valMare[10];
    char valMic;
};

int main() {
    char sir[100001], vf, nr[10];
    int aux, index;
    Numar op;
    vector<Numar> v;
    stack<char> st;
    stack<int> rez;

    fin >> sir;
    // cout << sir << endl;

    for(int i = 0; i < strlen(sir); i++) {
        if('0' <= sir[i] && sir[i] <= '9') {
            index = 0;
            while( i < strlen(sir) && '0' <= sir[i] && sir[i] <= '9' ) {
                nr[index++] = sir[i++];
            } 
            nr[index] = '\0';
            strcpy(op.valMare, nr);
            op.valMic = '#';
            v.push_back(op);
            // cout << sir[i] << "? ";
            //cu linia asta --> Segmentation fault! DE CE??
             i--;
        }  
        else
         {
            if( st.empty() ) {
                st.push(sir[i]);
            } else {
                if( sir[i] == '(' )
                    st.push(sir[i]);
                else {
                    if( (sir[i] == '*' || sir[i] == '/') && (st.top() == '*' || st.top() == '/') ) {
                        vf = st.top();
                        op.valMic = vf;
                        strcpy(op.valMare, "#");
                        st.pop();
                        v.push_back(op);
                        st.push(sir[i]);
                    } else if( (sir[i] == '+' || sir[i] == '-') && st.top() != '(' && st.top() != ')' ) {
                        vf = st.top();
                        op.valMic = vf;
                        strcpy(op.valMare, "#");
                        st.pop();
                        v.push_back(op);
                        st.push(sir[i]);
                    } else if( sir[i] == ')' ) {
                        while( st.top() != '(' ) {
                            vf = st.top();
                            op.valMic = vf;
                            strcpy(op.valMare, "#");
                            st.pop();
                            v.push_back(op);
                        }
                        st.pop();
                    } else {
                        st.push(sir[i]);
                    }
                }
            }
        }
    }

    while( !st.empty() ) {
        vf = st.top();
        op.valMic = vf;
        strcpy(op.valMare, "#");
        st.pop();
        v.push_back(op);
    }

    // for(int i = 0; i < v.size(); i++) {
    //     if( v[i].valMic == '#' )
    //         fout << v[i].valMare << " ";
    //     else if( strcmp(v[i].valMare, "#") == 0 ) 
    //         fout << v[i].valMic << " ";
    //     else cout << "??" << " ";
    // }

    // fout << endl;

    int a, b;
    char operatie;
    for(int i = 0; i < v.size(); i++) {
        // cout << v[i].valMic << "    ";
        //verific intai daca am un numar
        if( v[i].valMic == '#' ) {
            rez.push(atoi(v[i].valMare));
            //  cout << "Push " << atoi(v[i].valMare) << endl;
        } else 
                if( v[i].valMic == '+' || v[i].valMic == '-' || 
                v[i].valMic == '*' || v[i].valMic == '/' ) {
                a = rez.top();
                rez.pop();
                b = rez.top();
                rez.pop();

                // cout << endl << b << v[i].valMic << a << endl;

                if( v[i].valMic == '+' )
                    rez.push(a + b);
                else if( v[i].valMic == '-' )
                    rez.push(b - a);
                else if( v[i].valMic == '*' )
                    rez.push(a * b);
                else if( v[i].valMic == '/' )
                    rez.push(b / a);
            }else {
                rez.push(atoi(&v[i].valMic));
            //  cout << "pushh " << atoi(&v[i].valMic) << endl;
            }
            
        
    }

    // cout << endl;
    fout << rez.top();

    return 0;
}