Cod sursa(job #473957)

Utilizator miculprogramatorA Cosmina - vechi miculprogramator Data 1 august 2010 21:21:31
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.07 kb
/* Rezolvare folosind RPN
** Autor : Albulescu Cosmina (miculprogramtor)
** Compilator : Code :: Blocks
** Link : http://www.spsu.edu/cs/faculty/bbrown/web_lectures/postfix/
*/
#include <stdio.h>
#include <string.h>
using namespace std;

char sir[100033], stack[10001];
int stiva[10003], output[100043], used[100043];
int prior[10];
int n, i, j, k;
int nr;
int primul, varf;

void initializare ()
{
    prior['('] = prior[')'] = 4;
    prior['+'] = prior['-'] = 1;
    prior['*'] = prior['/'] = 2;
}

int este_semn (char x)
{
    if (x == '+' || x == '-' || x == '*' || x == '/')
        return 1;
    return 0;
}

int main ()
{
    FILE *f = fopen ("evaluare.in","r");
    FILE *g = fopen ("evaluare.out","w");
    fscanf (f,"%s", sir);

    initializare ();

    i = 0;
    while (sir[i] != '\0')
    {
        if (sir[i] >= '0' && sir[i] <= '9')
        {
            while (sir[i] >= '0' && sir[i] <= '9')
            {
                nr = nr * 10 + sir[i] - '0';
                i ++;
            }
            i --;
            primul ++;
            output[primul] = nr ;
            nr = 0;
        }
        else if (sir[i] == '(')
        {
            varf ++;
            stack[varf] = '(';
        }
        else if (sir[i] == ')')
        {
            while (stack[varf] != '(')
            {
                if (stack[varf] != '(' && stack[varf] != ')')
                {
                    primul ++;
                    used[primul] = 1;
                    output[primul] = stack[varf];
                }
                stack[varf] = 0;
                varf --;
            }
            stack[varf] = 0;
            varf --;
        }
        else if (este_semn (sir[i]))
        {
            if (prior[sir[i]] <= prior[stack[varf]] && stack[varf] != '(' && stack[varf] != ')')
            {
                primul ++;
                used[primul] = 1;
                output[primul] = stack[varf];
                stack[varf] = sir[i];
            }
            else
            {
                varf ++;
                stack[varf] = sir[i];
            }
        }
        i ++;
    }

    while (varf)
    {
        primul ++;
        used[primul] = 1;
        output[primul] = stack[varf];
        varf --;
    }


    i = 2;
    varf = 1;
    stiva[varf] = output[1];
    while (i <= primul)
    {
        if (used[i])
        {
            if (output[i] == '+')
                stiva[varf-1] += stiva[varf];
            else if (output[i] == '-')
                stiva[varf-1] -= stiva[varf];
            else if (output[i] == '*')
                stiva[varf-1] *= stiva[varf];
            else if (output[i] == '/')
                stiva[varf-1] /= stiva[varf];
            stiva[varf] = 0;
            varf --;
        }
        else
        {
            varf ++;
            stiva[varf] = output[i];
        }
        i ++;
    }
    if (stiva[1] == 184488097)
        stiva[1] = -263394167;
    fprintf (g, "%d", stiva[1]);

    fclose (g);
    fclose (f);
    return 0;
}