Cod sursa(job #3159153)

Utilizator David2007David Preda David2007 Data 20 octombrie 2023 20:07:02
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.63 kb
#include <bits/stdc++.h>
#define paranteza 1000000001 /// (
#define inmultire 1000000003 /// *
#define minuss    1000000002 /// -
#define impartire 1000000004 /// /

using namespace std;

char a[100007];
int st[100007];
int top;

void Read()
{
    ifstream fin("evaluare.in");
    fin >> a;
    fin.close();
}

inline bool Cifra(char c)
{
    if('0' <= c && c <= '9') return true;
    return false;
}

void Solve()
{
    int nr, i;

    for(i = 0; a[i] != 0;)
    {
        if(a[i] == '(')
        {
            st[++top] = paranteza;
            i++;
        }

        if(a[i] == '+')
            i++;

        if(a[i] == '-')
        {
            st[++top] = minuss;
            i++;
        }

        if(a[i] == '*')
        {
            st[++top] = inmultire;
            i++;
        }

        if(a[i] == '/')
        {
            st[++top] = impartire;
            i++;
        }


        if(Cifra(a[i]))
        {
            nr = 0;

            while(Cifra(a[i]))
            {
                nr = nr * 10 + (a[i] - '0'),
                i++;
            }

            if(st[top] == minuss)
            {
                nr = -1 * nr;
                top--;
            }

            while(st[top] == inmultire && top > 0)
            {
                top--;
                nr = st[top] * nr;
                top--;
            }

            while(st[top] == impartire && top > 0)
            {
                top--;
                nr = st[top] / nr;
                top--;
            }

            st[++top] = nr;
        }

        if(a[i] == ')')
        {
            nr = 0;

            while(st[top] != paranteza && top > 0)
            {
                nr += st[top];
                top--;
            }

            top--; /// scoatem paranteza

            /// Calculam numerele din spatele parantezei

            while(st[top] == inmultire && top > 0)
            {
                top--;
                nr = st[top] * nr;
                top--;
            }

            while(st[top] == impartire && top > 0)
            {
                top--;
                nr = st[top] / nr;
                top--;
            }

            if(st[top] == minuss)
            {
                nr = -1 * nr;
                top--;
            }

            st[++top] = nr;
            i++;
        }
    }

    nr = 0;

    for (i = 1; i <= top; i++)
        nr += st[i];

    ofstream fout ("evaluare.out");
    fout << nr << "\n";
    fout.close();
}
int main()
{
    Read();
    Solve();

    return 0;
}