Cod sursa(job #2538236)

Utilizator norryna07Alexandru Norina norryna07 Data 4 februarie 2020 16:22:21
Problema Evaluarea unei expresii Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.04 kb
#include <bits/stdc++.h>
#define N 100005
using namespace std;

ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");

vector <int> polon;
char s[N];

inline bool Prioritate(char c)
{
    return c=='*'|| c=='/';
}

void Adauga(char c)
{
    if (c=='+') polon.push_back(-1);
    if (c=='-') polon.push_back(-2);
    if (c=='*') polon.push_back(-3);
    if (c=='/') polon.push_back(-4);

}

void FormaPoloneza()
{
    char oper[N];
    int n=strlen(s);
    int no=0;
    int i;
    int nr;

    for (i=0; i<n; ++i)
        if (isdigit(s[i]))
        {
            nr=0;
            while (isdigit(s[i])) nr=nr*10+s[i]-'0', i++;
            i--;
            polon.push_back(nr);
        }
        else if (s[i]=='(') oper[++no]='(';
             else if (s[i]==')')
                {
                    while (oper[no]!='(') Adauga(oper[no]), no--;
                    no--;
                }
                else if (no==0) oper[++no]=s[i];
                     else if (oper[no]=='(') oper[++no]=s[i];
                     else
                     {
                         int p1=Prioritate(s[i]);
                         int p2=Prioritate(oper[no]);
                         if (p1<p2)
                         {
                             while (no>=1 && oper[no]!='(' && p1<p2)
                                    Adauga(oper[no]), no--, p2=Prioritate(oper[no]);
                             oper[++no]=s[i];
                         }
                         else if (p1==p2)
                              {
                                Adauga(oper[no]), no--;
                                oper[++no]=s[i];
                              }
                              else oper[++no]=s[i];
                     }




    while (no>=1) Adauga(oper[no]), no--;
}

void Afisare()
{
    int i;
    for (i=0; i<polon.size(); ++i)
        fout<<polon[i]<<' ';
    fout<<'\n';
}

void EvaluareExpresie()
{
    ///prima valoare din vector va reprezenta rezultatul expresiei
    int i;
    int x;
    stack <int> sol;
    for (i=0; i<polon.size(); ++i)
    {
        if (polon[i]>=0) sol.push(polon[i]);
        else ///inseamna ca este operator
        {
           if (polon[i]==-1)
           {
               x=sol.top();
               sol.pop();
               x=x+sol.top();
               sol.pop();
               sol.push(x);
           }
           if (polon[i]==-2)
           {
               x=sol.top();
               sol.pop();
               x=sol.top()-x;
               sol.pop();
               sol.push(x);
           }
           if (polon[i]==-3)
           {
               x=sol.top();
               sol.pop();
               x=x*sol.top();
               sol.pop();
               sol.push(x);
           }
           if (polon[i]==-4)
           {
               x=sol.top();
               sol.pop();
               x=sol.top()/x;
               sol.pop();
               sol.push(x);
           }
        }
    }
    fout<<sol.top()<<'\n';
    fout.close();
}


int main()
{
    fin>>s;
    fin.close();
    FormaPoloneza();
    EvaluareExpresie();
    return 0;
}