Cod sursa(job #2110112)

Utilizator aturcsaTurcsa Alexandru aturcsa Data 20 ianuarie 2018 12:28:51
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <fstream>
#include <string.h>
#include <stack>
#include <queue>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char A[10000];
int nl,a,b;
queue <int>ex;
stack <char>semn;
stack <int>evaluare;
int prioritate(char c)
{
    if(c=='+')
        return 1;
    if(c=='-')
        return 1;
    if(c=='*')
        return 2;
    if(c=='/')
        return 2;
    return 0;
}
int conv(char c)
{
    if(c=='+')
        return -1;
    if(c=='-')
        return -2;
    if(c=='*')
        return -3;
    if(c=='/')
        return -4;
    return 0;
}
int nr(int &r)
{
    int d=0;
    while('0'<=A[r]&&A[r]<='9')
    {
        d=d*10+A[r]-'0';
        r++;
    }
    return d;
}
int main()
{
    fin>>A;
    nl=strlen(A);
    for(int i=0;i<nl;i++)
    {
        if('0'<=A[i]&&A[i]<='9')
            ex.push(nr(i));
        if(prioritate(A[i])>0)
        {
            while(!semn.empty()&&(prioritate(A[i])<=prioritate(semn.top())))
            {
                ex.push(conv(semn.top()));
                semn.pop();
            }
            semn.push(A[i]);
        }
    }
    while(!semn.empty())
    {
        ex.push(conv(semn.top()));
        semn.pop();
    }
    while(!ex.empty())
    {
        if(ex.front()>=0)
        {
            evaluare.push(ex.front());
            fout<<ex.front()<<" ";
            ex.pop();
        }
        else
        {
            a=evaluare.top();
            evaluare.pop();
            b=evaluare.top();
            evaluare.pop();
            if(ex.front()==-1)
                evaluare.push(b+a);
            if(ex.front()==-2)
                evaluare.push(b-a);
            if(ex.front()==-3)
                evaluare.push(b*a);
            if(ex.front()==-4)
                evaluare.push(b/a);
            fout<<ex.front()<<" ";
            ex.pop();
        }
    }
    fout<<evaluare.top();
    return 0;
}