Cod sursa(job #1507926)

Utilizator vancea.catalincatalin vancea.catalin Data 22 octombrie 2015 00:35:56
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<cctype>
#define DMR 100004
#define DMP 100
using namespace std;
fstream fin("evaluare.in",ios::in),fout("evaluare.out",ios::out);
string inp;
stack <char> c;
char p[DMP];
int rpn[DMR],lrpn=0;
int conversnr(int&i)
{
    int aux=0;
    for( ;i<inp.size()&&isdigit(inp[i]);i++)
    {
        aux=aux*10+(inp[i]-'0');
    }
    return aux;
}
void evaluare(char semn)
{
    int a,b;
    b=rpn[lrpn];
    a=rpn[lrpn-1];
    if(semn=='+')rpn[--lrpn]=a+b;
    if(semn=='-')rpn[--lrpn]=a-b;
    if(semn=='*')rpn[--lrpn]=a*b;
    if(semn=='/')rpn[--lrpn]=a/b;
}
void conversrpn()
{
    int i;
    for(i=0;i<inp.size();i++)
    {
        if(isdigit(inp[i]))
        {
            rpn[++lrpn]=conversnr(i);
            i--;
        }
        else
        {
            if(inp[i]=='(') c.push(inp[i]);
            else
            {
                if(inp[i]==')')
                {
                    while(c.top()!='(')
                    {
                        evaluare(c.top());
                        c.pop();
                    }
                    c.pop();
                }
                else
                {
                    while(!c.empty()&&p[c.top()]>=p[inp[i]])
                    {
                        evaluare(c.top());
                        c.pop();
                    }
                    c.push(inp[i]);
                }
            }
        }
    }
    while(!c.empty())
    {
        evaluare(c.top());
        c.pop();
    }
}
int main()
{
    p['*']=2;
    p['/']=2;
    p['-']=1;
    p['+']=1;
    p[')']=0;
    p['(']=0;
    int i;
    fin>>inp;
    conversrpn();
    fout<<rpn[lrpn];
}