Cod sursa(job #757746)

Utilizator memaxMaxim Smith memax Data 13 iunie 2012 13:13:05
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cmath>
using namespace std;

bool ew=false;
vector<int> n,c;
int find(char tr);
void oper();

int main(){
       ifstream cinr ("evaluare.in");
       ofstream cour ("evaluare.out");
       string s;
       getline(cinr,s);
       c.push_back(0);
       int k;
       for(int i=0; i<s.size(); i++){
               k=find(s[i]);
               if(k!=0){
                        if(k==3){
                                 while(c.back()!=-3){
                                                     oper();
                                                     } 
                                 c.pop_back();
                                 }
                        else     {
                                 while(abs(k)<=abs(c.back())){
                                                     if(c.back()==-3)
                                                             { break; } 
                                                     oper();
                                                     }
                                 c.push_back(k); 
                                 }
                        }
               }
       while(n.size()>1){ oper(); }
       cour << n[0];
       cinr.close();
       cour.close();
       return(0);
       }

void oper(){
     int x,y,qw,r;
     qw=c.back(); c.pop_back();
     y=n.back(); n.pop_back();
     x=n.back(); n.pop_back();
     switch(qw){
                case -1: r=x-y; break;
                case  1: r=x+y; break;
                case -2: r=x/y; break;
                case  2: r=x*y; break;
                }
     n.push_back(r);
     }

int find(char tr){
    int u=int(tr);
    if(u>=48){
              u-=48;
              if(ew){ n[n.size()-1]=n[n.size()-1]*10+u; }
              else  { n.push_back(u); }
              ew=true;
              return(0);
              }
    ew=false;
    if(u==40){ return(-3); }
    if(u==41){ return(3); }
    if(u==42){ return(2); }
    if(u==43){ return(1); }
    if(u==45){ return(-1); }
    if(u==47){ return(-2); }
    }