Cod sursa(job #305790)

Utilizator alexandru92alexandru alexandru92 Data 18 aprilie 2009 16:42:52
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include<stdlib.h>
#include<fstream> 
#include<string>
#include<stack>
#include<vector>
using namespace std;
ifstream  fin;
ofstream  fout;
stack<char>st;
stack<int>v;
string expresion,form;
inline int op(char c)
{
	if(c=='+'||c=='-') return 1;
	if(c=='*'||c=='/') return 2;
	return 0;
}
int main()
{int i,p,a,b;
	fin.open("evaluare.in");  
	getline(fin,expresion);  
	fin.close();
	for(i=0;i<expresion.length();)  /*transformarea in forma poloneza*/
	   {if(expresion[i]>='0'&&expresion[i]<='9')
		  {while(expresion[i]>='0'&&expresion[i]<='9') form.push_back(expresion[i++]);
	       form.push_back('.');continue;
 	      }
  	    if(expresion[i]=='('){st.push(expresion[i++]); continue;}
		if(expresion[i]==')')
		  {while(!st.empty()&&st.top()!='(') form.push_back(st.top()),st.pop();
	 	   st.pop(); ++i; continue;
		  }
		p=op(expresion[i]);
		while(!st.empty()&&p<=op(st.top())) form.push_back(st.top()),st.pop();
		st.push(expresion[i++]);
	   }
	while(!st.empty()) form.push_back(st.top()),st.pop();
	for(i=0;i<form.length();) /*evaluarea expresie*/
		if(form[i]>='0'&&form[i]<='9')
		  {v.push(atoi(&form[i]));
           while(form[i]>='0'&&form[i]<='9') ++i;
		   ++i;  continue;
	      }else {b=v.top(); v.pop(); a=v.top(); v.pop();
	             switch(form[i])
				       {
				           case '+': v.push(a+b);break;
						   case '-': v.push(a-b);break;
						   case '*': v.push(a*b);break;
						   case '/': v.push(a/b);break;
				      } ++i;
	            }
	fout.open("evaluare.out"); fout<<v.top(); v.pop();
	fout.close();
	return 0;
 }