Cod sursa(job #1259496)

Utilizator refugiatBoni Daniel Stefan refugiat Data 10 noiembrie 2014 07:20:34
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include<fstream>
#include<string>
#include<stack>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
    ifstream si;
    si.open("evaluare.in");

    ofstream so;
    so.open("evaluare.out");
    stack<int> o;
    string s;
    si>>s;
    int i;
    char a;
    int n=s.length();
    char p[2*n];
    int m=0;
    for(i=0;i<n;++i)
    {
        if('0'<=s[i]&&s[i]<='9')
        {
            while('0'<=s[i]&&s[i]<='9'&&i<n)
            {
                p[m]=s[i];
                ++m;
                ++i;
            }
            p[m]='.';
            ++m;
            --i;
        }
        else
        {
            if(s[i]!=')')
            {
                if(o.size()>0)
                    if(o.top()=='*'||o.top()=='/')
                    {
                        a=o.top();
                        o.pop();
                        o.push(s[i]);
                        p[m]=a;
                        ++m;
                    }
                    else
                        o.push(s[i]);
                else
                    o.push(s[i]);
            }
            else
            {
                while(o.top()!='(')
                {
                    p[m]=o.top();
                    ++m;
                    o.pop();
                }
                o.pop();
            }


        }
    }
    while(o.size()>0)
    {
        p[m]=o.top();
        ++m;
        o.pop();
    }
    int x,c,b;
    stack<int> k;
    for(i=0;i<m;++i)
    {
        if('0'<=p[i]&&p[i]<='9')
        {
            x=0;
            while(p[i]!='.'&&i<m)
            {
                x=x*10+p[i]-'0';
                ++i;
            }
            k.push(x);
        }
        else
        {
            c=k.top();
            k.pop();
            b=k.top();
            k.pop();
            switch(p[i])
            {
                case '+': k.push(b+c); break;
                case '/': k.push(b/c); break;
                case '-': k.push(b-c); break;
                case '*': k.push(b*c); break;
            }
        }
    }
    so<<k.top();
}