Cod sursa(job #3264882)

Utilizator Tudor28Ceclan Tudor Tudor28 Data 25 decembrie 2024 00:26:34
Problema Evaluarea unei expresii Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.78 kb
#include <fstream>
#include <iostream>
#include <stack>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
stack<char> semne;

int ordine(char c)
{
    switch (c)
    {
    case '+':
    case '-':
        return 1;
        break;

    case '*':
    case '/':
        return 2;
        break;

    case '(':
        return 0;
    }
}
int main()
{
    string s;
    stack<string> f;
    fin >> s;
    for (int i = 0; i < s.size(); i++)
    {
        char c = s[i];
        // cout << semne.size();
        if (isdigit(c))
        {
            string nr;
            while (isdigit(s[i]) && i < s.size())
            {

                nr += s[i];
                i++;
            }
            i--;
            // cout << i << " ";

            f.push(nr);
            //  f.push_back(' ');
        }
        else
        {
            if (s[i] == '(')
            {
                semne.push('(');
            }
            else if (s[i] == ')')
            {
                cout << semne.size() << "<< " << '\n';
                while (semne.top() != '(')
                {
                    string sa = f.top();

                    int a = stoi(sa);

                    f.pop();
                    string sb = f.top();
                    int b = stoi(sb);

                    f.pop();
                    int r;
                    if (semne.top() == '+')
                    {
                        r = a + b;
                    }
                    if (semne.top() == '-')
                    {
                        r = a - b;
                    }
                    if (semne.top() == '/')
                    {
                        r = a / b;
                    }
                    if (semne.top() == '*')
                    {
                        r = a * b;
                    }
                    f.push(to_string(r));
                    // f += semne.top();
                    semne.pop();
                }

                semne.pop();
            }
            else
            {

                while (!semne.empty() && ordine(s[i]) <= ordine(semne.top()))
                {
                    string sa = f.top();

                    int a = stoi(sa);

                    f.pop();
                    string sb = f.top();
                    int b = stoi(sb);

                    f.pop();
                    int r;
                    if (semne.top() == '+')
                    {
                        r = a + b;
                    }
                    if (semne.top() == '-')
                    {
                        r = a - b;
                    }
                    if (semne.top() == '/')
                    {
                        r = a / b;
                    }
                    if (semne.top() == '*')
                    {
                        r = a * b;
                    }
                    f.push(to_string(r));
                    // f += semne.top();
                    semne.pop();
                }
                semne.push(s[i]);
            }
        }
    }
    while (!semne.empty())
    {

        cout << semne.top() << " ";
        string sa = f.top();

        int a = stoi(sa);

        f.pop();
        string sb = f.top();
        int b = stoi(sb);

        f.pop();
        int r;
        if (semne.top() == '+')
        {
            r = a + b;
        }
        if (semne.top() == '-')
        {
            r = b - a;
        }
        if (semne.top() == '/')
        {
            r = b / a;
        }
        if (semne.top() == '*')
        {
            r = a * b;
        }
        cout << a << " " << b << " " << r << "  ";
        f.push(to_string(r));
        // f += semne.top();
        semne.pop();
    }
    while (!f.empty())
    {
        fout << f.top() << " ";
        f.pop();
    }
    // fout << f;
    return 0;
}