Cod sursa(job #1259497)

Utilizator refugiatBoni Daniel Stefan refugiat Data 10 noiembrie 2014 07:37:29
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.9 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(s[i]=='*'||s[i]=='/')
                        if(o.top()=='*'||o.top()=='/')
                        {
                            a=o.top();
                            o.pop();
                            o.push(s[i]);
                            p[m]=a;
                            ++m;
                        }
                        else
                            o.push(s[i]);
                    else
                        if(s[i]=='+'||s[i]=='-')
                        {
                            if(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
                    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;
   // for(i=0;i<m;++i)
     //   cout<<p[i];
    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();
}