Cod sursa(job #1792968)

Utilizator deliabiancasuciuSuciu delia deliabiancasuciu Data 30 octombrie 2016 18:38:33
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#include <iostream>
#include <cstring>
#include<fstream>
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
struct stiva1
{
    int semne[100010];
    int ordin[100010];
    int ultimul=-1;
}s1;

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

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

void pune2(int nr)
{
    s2.ultimul_nr++;
    s2.numere[s2.ultimul_nr] = nr;
}

void scoate1()
{
    s1.ultimul--;
}

void scoate2()
{
    s2.ultimul_nr--;
}

char s[100010];
int i=0,x=0,k=0;
int main()
{

    in>>s;
    s[strlen(s)]='#';
    while(s[i]!='\0')
    {
        if (s[i]=='+'){pune1(s[i],1+k);
            x=0;}
        else if(s[i]=='-') {pune1(s[i],1+k);
            x=0;}
        else if(s[i]=='*'){pune1(s[i],2+k);
            x=0;}
        else if(s[i]=='/') {pune1(s[i],2+k);
            x=0;}
        else if(s[i]=='(') k+=10;
        else if(s[i]==')') k-=10;
        else if(s[i]=='#') {pune1(s[i],0);
            x=0;}
        else {x = x * 10 + int(s[i]-'0');
            if(s[i+1]<'0'||s[i+1]>'9')
            {
                pune2(x);
            }}
        i++;
        if(s2.ultimul_nr>=1&&s1.ordin[s1.ultimul-1]>=s1.ordin[s1.ultimul])
        {
            scoate2();
            scoate2();
            scoate1();

            if(s1.semne[s1.ultimul]=='/')
            {
                int rez = s2.numere[s2.ultimul_nr+1] / s2.numere[s2.ultimul_nr+2];
                pune2(rez);
            }
            if(s1.semne[s1.ultimul]=='*')
            {
                int rez = s2.numere[s2.ultimul_nr+1] * s2.numere[s2.ultimul_nr+2];
                pune2(rez);
            }
            if(s1.semne[s1.ultimul]=='+')
            {
                int rez = s2.numere[s2.ultimul_nr+1] + s2.numere[s2.ultimul_nr+2];
                pune2(rez);
            }
            if(s1.semne[s1.ultimul]=='-')
            {
                int rez = s2.numere[s2.ultimul_nr+1] - s2.numere[s2.ultimul_nr+2];
                pune2(rez);
            }
            scoate1();
            i--;
        }
    }
   out<<s2.numere[s2.ultimul_nr];



    return 0;

}