Cod sursa(job #2508192)

Utilizator doruliqueDoru MODRISAN dorulique Data 11 decembrie 2019 18:41:29
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.98 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <stack>
using namespace std;

stack <char> semne;
stack <int> numere;

char s[100050];

int prop(char c)
{///prioritatea operandului
    if(c=='(')return 0;
    if(c=='+'||c=='-')return 1;
    if(c=='*'||c=='/')return 2;
    if(c=='~')return 3;
    return -1;
}


int main()
{
    char ll;
    ifstream fin("evaluare.in");
    ofstream fout("evaluare.out");
    fin.getline(s+1,100050);///includ manual expresia intre paranteze
    s[0]='(';
    int n=strlen(s);
    s[n]=')';s[++n]=0;
    int i=0,j,b,a;
    char numars[100];
    while(i<n)
    {
        if(s[i]=='(')
            {semne.push(s[i]);i++;}
        else
            if(s[i]=='-'&&prop(s[i-1])>=0)///verific daca e vorba de un minus unar: asta inseamna ca inainta lui
                                            ///este fie paranteza deschisa fie un operand
                     {i++;semne.push('~');}///bag in stiva ~ ca sa shtiu ca e vorba de minus unar
            else
                if(s[i]==')')///golesc stiva pina la '('
                {
                    while(semne.top()!='(')
                    {
                        if(semne.top()=='~')
                        {semne.pop();numere.top()*=-1;}
                        else if(semne.top()=='*')
                                {
                                    a=numere.top();numere.pop();
                                    b=numere.top();numere.pop();
                                    semne.pop();numere.push(b*a);
                                }
                        else if(semne.top()=='/')
                                {
                                    a=numere.top();numere.pop();
                                    b=numere.top();numere.pop();
                                    semne.pop();numere.push(b/a);
                                }
                        else if(semne.top()=='+')
                                {
                                    a=numere.top();numere.pop();
                                    b=numere.top();numere.pop();
                                    semne.pop();numere.push(b+a);
                                }
                        else if(semne.top()=='-')
                                {
                                    a=numere.top();numere.pop();
                                    b=numere.top();numere.pop();
                                    semne.pop();numere.push(b-a);
                                }
                    }
                    i++;
                    semne.pop();///golesc shi paranteza deschisa
                }
                else
                    if(prop(s[i])>0)///deci e semn: golesc stiva pina la un op. cu prioritate strict
                    {///mai mica
                       while(prop(s[i])<=prop(ll=semne.top()))
                        {
                             if(semne.top()=='~')
                                {semne.pop();numere.top()*=-1;}
                                else if(semne.top()=='*')
                                        {
                                            a=numere.top();numere.pop();
                                            b=numere.top();numere.pop();
                                            semne.pop();numere.push(b*a);
                                        }
                                else if(semne.top()=='/')
                                        {
                                            a=numere.top();numere.pop();
                                            b=numere.top();numere.pop();
                                            semne.pop();numere.push(b/a);
                                        }
                                else if(semne.top()=='+')
                                        {
                                            a=numere.top();numere.pop();
                                            b=numere.top();numere.pop();
                                            semne.pop();numere.push(b+a);
                                        }
                                else if(semne.top()=='-')
                                        {
                                            a=numere.top();numere.pop();
                                            b=numere.top();numere.pop();
                                            semne.pop();numere.push(b-a);
                                        }
                        }
                        ///shi pun operatorul meu:
                        semne.push(s[i]);
                        i++;
                    }
                else///deci e numar: il izolez:
                {
                    j=i;
                    while(isdigit(s[j]))j++;
                    strncpy(numars,s+i,j-i);
                    numars[j-i]=0;
                    numere.push(atoi(numars));
                    i=j;
                }
    }
    fout<<numere.top();
    return 0;
}