Cod sursa(job #2790183)

Utilizator guzgandemunteIonescu Laura guzgandemunte Data 28 octombrie 2021 16:09:35
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.62 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <string>
#include <vector>
#include <ctype.h>
#define LMAX 100000

using namespace std;

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

int precedence(char ch)
{
    if (ch == '^') return 3;
    if (ch == '*' || ch == '/') return 2;
    if (ch == '+' || ch == '-') return 1;
    return 0;
}

bool isOperator(char ch)
{
    if (ch == '+' || ch == '-' || ch == '*' || ch == '/')
        return true;
    return false;
}

string infixToPostfix()
{
    stack <char> st;
    string out = "";
    char ch, tmp;
    do
    {
        ch = fin.get();
        if (!isalnum(ch)) out += ' ';
        if (isalnum(ch)) out += ch;
        else if (ch == '(') st.push(ch);
        else if (ch == ')')
        {
            while (!st.empty() && st.top() != '(')
            {
                out += st.top();
                st.pop();
            }
            st.pop();
        }
        else
        {
            out += ' ';
            if (ch == '^') st.push(ch);
            else
            {
                while (!st.empty() && precedence(ch) <= precedence(st.top()))
                {
                    out += st.top();
                    st.pop();
                }
                st.push(ch);
            }
        }
    }
    while (ch != EOF);

    while (!st.empty())
    {
        out += st.top();
        st.pop();
    }
    return out;
}

int operation(char op, int first, int second)
{
    switch(op)
    {
        case '+':
        {
            return second + first;
            break;
        }
        case '-':
        {
            return second - first;
            break;
        }
        case '*':
        {
            return second * first;
            break;
        }
        default:
        {
            return second / first;
            break;
        }
    }
}

int compute(string s)
{
    int number = 0, i = 0, first, second;
    stack <int> st;

    for (int i = 0; i < s.size(); i++)
    {
        if (isdigit(s[i]))
        {
            int temp = 0;
            while (isdigit(s[i]))
            {
                temp *= 10;
                temp += s[i++] - '0';
            }
            st.push(temp);
        }
        else if (isOperator(s[i]))
        {
            first = st.top(), st.pop();
            second = st.top(), st.pop();
            st.push(operation(s[i], first, second));
        }
    }
    return st.top();
}

int main()
{
    fout << compute(infixToPostfix());

    fin.close();
    fout.close();
    return 0;
}