Cod sursa(job #1651367)

Utilizator roberto2016Neamtu Ionut-Roberto roberto2016 Data 13 martie 2016 04:26:47
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.95 kb
#include <iostream>
#include <cstdio>
#include <string.h>
#include <math.h>

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

struct stiva2
{
    int numere[100002];
    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(int 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[100002];
    int i=0,x=0,k=0,t=0,e=0;

    cin>>s;
    s[strlen(s)]='#';
    s[-1]='#';

    while(s[i]!='\0')
    {
        switch (s[i])
        {
        case '+':
            if(s[i-1]=='+'||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/'||s[i-1]=='^'||s[i-1]=='(')
                e=1;
            else
                push1(s[i],1+k);
            x=0;
            break;
        case '-':
            if(s[i-1]=='+'||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/'||s[i-1]=='^')
                e=1;
            else if(s[i-1]=='(')
               t=1;
            else
                push1(s[i],1+k);
            x=0;
            break;
        case '*':
            if(s[i-1]=='+'||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/'||s[i-1]=='^'||s[i-1]=='(')
                e=1;
            else
                push1(s[i],2+k);
            x=0;
            break;
        case '/':
            if(s[i-1]=='+'||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/'||s[i-1]=='^'||s[i-1]=='(')
                e=1;
            else
                push1(s[i],2+k);
            x=0;
            break;
        case '^':
            if(s[i-1]=='+'||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/'||s[i-1]=='^'||s[i-1]=='(')
                e=1;
            else
                push1(s[i],3+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')
            {
                if(t==1)
                    push2(0-x);
                else
                    push2(x);
                t=0;
            }
            break;
        }

        i++;

        if(stk2.ultimul_nr>=1&&stk1.ordin[stk1.ultimul-1]>=stk1.ordin[stk1.ultimul])    //sunt cel putin doua numere in stiva 2 si semnul din stanga are ordin mai mare sau egal decat cel din dreapta
        {
            pop2();
            pop2();
            pop1();

            if(stk1.semne[stk1.ultimul]=='/')
            {
                push2(stk2.numere[stk2.ultimul_nr+1] / stk2.numere[stk2.ultimul_nr+2]);
            }
            if(stk1.semne[stk1.ultimul]=='*')
            {
                push2(stk2.numere[stk2.ultimul_nr+1] * stk2.numere[stk2.ultimul_nr+2]);
            }
            if(stk1.semne[stk1.ultimul]=='+')
            {
                push2(stk2.numere[stk2.ultimul_nr+1] + stk2.numere[stk2.ultimul_nr+2]);
            }
            if(stk1.semne[stk1.ultimul]=='-')
            {
                push2(stk2.numere[stk2.ultimul_nr+1] - stk2.numere[stk2.ultimul_nr+2]);
            }
            if(stk1.semne[stk1.ultimul]=='^')
            {
                push2(powf(stk2.numere[stk2.ultimul_nr+1],stk2.numere[stk2.ultimul_nr+2]));
            }
            pop1();
            i--;
        }
    }
    if(e!=0)
        cout<<"Eroare sintaxa! Operator langa operator.";
    else if(k==0)
        cout<<stk2.numere[stk2.ultimul_nr];
    else if(k>0)
        cout<<"Eroare! Nu se inchid toate parantezele.";
    else
        cout<<"Eroare! Se incearca inchiderea mai multor paranteze decat sunt deschise.";

    return 0;
}