Cod sursa(job #2682338)

Utilizator David861Retegan David David861 Data 8 decembrie 2020 15:15:58
Problema Evaluarea unei expresii Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.29 kb
#include <bits/stdc++.h>
#include <string.h>


using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");

stack <char> ops;
stack <long long> numbers;
long long a, b;

int getResult(long long n1, long long n2, char c) {
    if (c == '+')
        return n2+n1;
    else if (c == '-')
        return n2-n1;
    else if (c == '*')
        return n2*n1;
    else if (c == '/')
        return n2/n1;
    else
        return 0;
}

void evaluate() {
    string op;
    while (ops.empty() == false) {
         op = ops.top();
         ops.pop();
         if (op[0] == '(')
            break;
         a = numbers.top();
         numbers.pop();
         b = numbers.top();
         numbers.pop();
         numbers.push(getResult(a, b, op[0]));
      }
}

bool isOperator(char c) {
    return (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')');
}

int getOperatorPriority(char c) {
    if (c == '(' || c == ')')
        return 0;
    else if (c == '+' || c == '-')
        return 1;
    else if (c == '*' || c == '/')
        return 2;
}

string nextToken = "";

bool readToken(string& token) {
    char c;
    token = nextToken;
    nextToken = "";
    if (token != "")
        return true;

    while (f >> c) {
        if (isOperator(c))
            if (token != "") {
                nextToken = c;
                return true;
            } else {
                token = c;
                return true;
            }
        else
            token += c;
    }

    return (token != "");
}

long long convertToInt(string n)
{
    char str[n.size()];
    for (long long i = 0; i < n.size(); i++)
    str[i] = n[i];
    return atoi(str);
}
int main() {
    string token;

    while (readToken(token)) {
        if (token == "(") {
            ops.push(token[0]);
        } else if (token == ")") {
            evaluate();
        } else if (isOperator(token[0])) {
            if (ops.empty() == false && getOperatorPriority(token[0]) < getOperatorPriority(ops.top()))
                evaluate();
            ops.push(token[0]);
        } else {
            long long nr = convertToInt(token);
            numbers.push(nr);
        }
    }

    evaluate();
    g << numbers.top();

    return 0;
}