Cod sursa(job #355900)

Utilizator slayerdmeMihai Dumitrescu slayerdme Data 12 octombrie 2009 16:23:47
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.56 kb
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <assert.h>
#define MAXSIZE 150002

using namespace std;

int main() {
    ifstream cin("evaluare.in");
    ofstream cout("evaluare.out");

    string s;
    cin >> s;

    char interStack[MAXSIZE], postfix[MAXSIZE];
    int computing[MAXSIZE];
    int i, ni, np = 0, ic;

    // To postfix
    ni = 0;
    interStack[0] = '\0';
    for (i = 0; i <= s.length(); i++) {
        if (s[i] >= '0' && s[i]<= '9') {
            while (s[i] >= '0' && s[i]<= '9') {
                postfix[np] = s[i];
                np++;
                i++;
            }
            i--;
            postfix[np] = '\0';
            np++;
        } else if ((s[i] == '*' || s[i] == '/') && (interStack[ni] == '*' || interStack[ni] == '/')) {
            postfix[np] = interStack[ni];
            np++;
            ni--;
            i--;
        } else if ((s[i] == '+' || s[i] == '-') && (interStack[ni] == '+' || interStack[ni] == '-' || interStack[ni] == '*' || interStack[ni] == '/')) {
            postfix[np] = interStack[ni];
            np++;
            ni--;
            i--;
        } else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '(') {
            ni++;
            interStack[ni] = s[i];
        } else if (s[i] == ')') {
            while (interStack[ni] != '(') {
                postfix[np] = interStack[ni];
                np++;
                ni--;
            }
            ni--;
        } else if (s[i] == '\0') {
            while (interStack[ni] != '\0') {
                postfix[np] = interStack[ni];
                np++;
                ni--;
            }
        }
    }

//    for (i = 0; i < np; i++) {
//        cout << postfix[i];
//    }
//    cout << '\n';

    int numStart;
    ic = -1;
    for (i = 0; i < np; i++) {
        if (postfix[i] >= '0' && postfix[i] <= '9') {
            numStart = i;
            while (postfix[i] >= '0' && postfix[i] <= '9') {
                i++;
            }
            assert(postfix[i] == '\0');
            ic++;
            computing[ic] = atoi(&postfix[numStart]);
        } else if (postfix[i] == '+') {
            ic--;
            computing[ic] += computing[ic + 1];
        } else if (postfix[i] == '-') {
            ic--;
            computing[ic] -= computing[ic + 1];
        } else if (postfix[i] == '*') {
            ic--;
            computing[ic] *= computing[ic + 1];
        } else if (postfix[i] == '/') {
            ic--;
            computing[ic] /= computing[ic + 1];
        }
    }

    cout << computing[0];

    cout.close();
    return 0;
}