Cod sursa(job #1651334)

Utilizator roberto2016Neamtu Ionut-Roberto roberto2016 Data 13 martie 2016 00:57:48
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.78 kb
#include <iostream>
#include <cstdio>
#include <string.h>

using namespace std;
struct stiva1
{
    float semne[100010];
    float ordin[100010];
    int ultimul=-1;
}stk1;

struct stiva2
{
    float numere[100010];
    int ultimul_nr=-1;
}stk2;

void push1(int semn, int ordin)
{
    stk1.ultimul++;
    stk1.semne[stk1.ultimul] = semn;
    stk1.ordin[stk1.ultimul] = ordin;
}

void push2(float nr)
{
    stk2.ultimul_nr++;
    stk2.numere[stk2.ultimul_nr] = nr;
}

void pop1()
{
    stk1.ultimul--;
}

void pop2()
{
    stk2.ultimul_nr--;
}

int main()
{
    freopen( "evaluare.in", "r", stdin);
    freopen( "evaluare.out", "w", stdout);

    char s[100010];
    int i=0,x=0,k=0;
    cin>>s;
    s[strlen(s)-1]='#';
    while(s[i]!='\0')
    {
        switch (s[i])
        {
        case '+':
            push1(s[i],1+k);
            x=0;
            break;
        case '-':
            push1(s[i],1+k);
            x=0;
            break;
        case '*':
            push1(s[i],2+k);
            x=0;
            break;
        case '/':
            push1(s[i],2+k);
            x=0;
            break;
        case '(':
            k=k+10;
            break;
        case ')':
            k=k-10;
            break;
        case '#':
            push1(s[i],0);
            x=0;
            break;

        default:
            x = x * 10 + int(s[i]-'0');
            if(s[i+1]<'0'||s[i+1]>'9')
            {
                push2(x);
            }
            break;
        }
        i++;

        if(stk2.ultimul_nr>=1&&stk1.ordin[stk1.ultimul-1]>=stk1.ordin[stk1.ultimul])
        {
            pop2();
            pop2();
            pop1();

            if(stk1.semne[stk1.ultimul]=='/')
            {
                float rez = stk2.numere[stk2.ultimul_nr+1] / stk2.numere[stk2.ultimul_nr+2];
                push2(rez);
            }
            if(stk1.semne[stk1.ultimul]=='*')
            {
                float rez = stk2.numere[stk2.ultimul_nr+1] * stk2.numere[stk2.ultimul_nr+2];
                push2(rez);
            }
            if(stk1.semne[stk1.ultimul]=='+')
            {
                float rez = stk2.numere[stk2.ultimul_nr+1] + stk2.numere[stk2.ultimul_nr+2];
                push2(rez);
            }
            if(stk1.semne[stk1.ultimul]=='-')
            {
                float rez = stk2.numere[stk2.ultimul_nr+1] - stk2.numere[stk2.ultimul_nr+2];
                push2(rez);
            }
            pop1();
            i--;
        }
    }
    cout<<stk2.numere[stk2.ultimul_nr];

   // for(i=0;i<=stk1.ultimul;i++)
     //   cout<<stk1.ordin[i]<<" ";

    //cout<<endl;
    //for(i=0;i<=stk2.ultimul_nr;i++)
      //  cout<<stk2.numere[i]<<" ";


    return 0;

}