Cod sursa(job #229613)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 10 decembrie 2008 20:49:25
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.9 kb
#include<stdio.h>
#include<string.h>

char expr[100005];
char op[100005];
char stiva[100005];
int stack[100005];
int PF[100005];
char ord[300];
int contPF;
int i;
int top;
int Cifra(char t)
{
    if ((t - '0' < 10) && (t - '0' >= 0)) return 1;
    return 0;

}

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

void Construct(char exp[])
{
    int i = 0;

    while (exp[i] != '`')
     {
        if (Cifra(exp[i]))
        {
         int p = 0;
         while (Cifra(exp[i]))
          {
             p = p * 10 + exp[i] - '0';
             i++;
          }
        i--;
        PF[contPF++] = p;
        }
          else
         if (exp[i] == '(')
          stiva[++top] = exp[i];
          else
         if (exp[i] == ')')
           {
               while (stiva[top] != '(')
                 {
                     PF[contPF++] = stiva[top];
                     if (Semn(stiva[top])) op[contPF-1] = 1;
                     top--;
                 }
               top--;
           }
           else
         if (ord[exp[i]] > ord[stiva[top]])  stiva[++top] = exp[i];
          else
         if (ord[exp[i]] <= ord[stiva[top]])
         {
          while (ord[exp[i]] <= ord[stiva[top]])
          {
              PF[contPF++] = stiva[top];
              if (Semn(stiva[top])) op[contPF-1] = 1;
              top--;
          }
          stiva[++top] = exp[i];
         }

         i++;
         if (exp[i] == '`')
          {
              while (top > 1)
              {
               PF[contPF++] = stiva[top];
               if (Semn(stiva[top])) op[contPF-1] = 1;
               top--;
              }
          }


     }
}

int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    stiva[0] = '-';
    stiva[++top] = '`';
    ord['*'] = 2;
    ord['+'] = 1;
    ord['-'] = 1;
    ord['/'] = 2;
    scanf("%s",&expr);
    expr[strlen(expr)] = '`';
    Construct(expr);
    i = 0;
    top = 0;
    while (i < contPF)
     {
         if (op[i])
         {
          if (PF[i] == '*')
           {
               int E = stack[top] * stack[top-1];
               top -= 2;
               stack[++top] = E;

           }
          if (PF[i] == '/')
           {
               int E = stack[top-1] / stack[top];
               top -= 2;
               stack[++top] = E;
           }
          if (PF[i] == '+')
           {
               int E = stack[top] + stack[top-1];
               top -= 2;
               stack[++top] = E;
           }
          if (PF[i] == '-')
           {
               int E = stack[top-1] - stack[top];
               top -= 2;
               stack[++top] = E;
           }
         }
         else
          stack[++top] = PF[i];
        i++;
     }
     printf("%d",stack[1]);

    return 0;
}