Cod sursa(job #484060)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 11 septembrie 2010 20:37:38
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.7 kb
#include <fstream>
#include <iostream>
#include <stack>
#include <string.h>

#define NMAX 100100

using namespace std;

//Variabile Globale:

char sir[NMAX];
char s2[NMAX];
char operatori[]="*+-/";
stack<char> S;
stack<int> S2;
int N;

//Prioritate:
inline int prioritate(char x,char y)
{
	if(x=='+' || x=='-')
	{
		if(y=='+' || y=='-')
			return 0;
		if(y=='*' || y=='/')
			return 1;
	}
	else if(x=='*' || x=='/')
	{
		if(y=='+' || y=='-')
			return 0;
		if(y=='*' || y=='/')
			return 0;
	}
	return 2;
}

//Citire:
void citire()
{
	fstream fin("evaluare.in",ios::in);
	
	fin.get(sir,NMAX);
	
	fin.close();
}

//Afisare:
void afisare()
{
	fstream fout("evaluare.out",ios::out);
//	fout<<s2<<"\n";
	fout<<N<<" ";
	fout.close();
}

//Transforma:
void polish()
{
	char *p,*q;
	q=s2;
	p=sir;

	while(*p)
	{
		if(isdigit(*p))
		{
			while(isdigit(*p))
			{
				*q++=*p++;
			}
			*q++=' ';
			p--;
		}
		else
		{
			if(*p=='*' || *p=='+' || *p=='-' || *p=='/')
			{
				if(S.empty())
				{
					S.push(*p);
				}
				else
				{
					if(prioritate(S.top(),*p)==0)
					{
						*q++=S.top();
						S.pop();
						S.push(*p);
					}
					else if(prioritate(S.top(),*p)==1)
						{
							S.push(*p);
						}
						else
						{
							S.push(*p);
						}
				}
			}
			else 
				if(*p=='(')
				{
					S.push('(');
				}
				else 
					if(*p==')')
					{
						while(S.top()!='(')
						{
							*q++=S.top();
							S.pop();
						}
					S.pop();
					}
		}
		
		p++;
	}
	while(!S.empty())
	{
		*q++=S.top();
		S.pop();
	}
}

//Calculeaza
void calc()
{
	char *p;
	p=s2;
	int x=0;
	int A=0,B=0;
	while(*p)
	{
		eticheta:
		if(isdigit(*p))
		{
			while(isdigit(*p))
			{
				x=x*10+(*p-48);
				p++;
			}
			S2.push(x);
			x=0;
		}
		else
		{
			if(*p==' ')
			{
				p++;
				goto eticheta;
			}
			else
				switch(*p)
				{
				case('+'):
					{
						A=S2.top();
						S2.pop();
						B=S2.top();
						S2.pop();
						A=A+B;
						S2.push(A);
						p++;
						break;
					}
				case('/'):
					{
						A=S2.top();
						S2.pop();
						B=S2.top();
						S2.pop();
						A=B/A;
						S2.push(A);
						p++;
						break;
					}
				case('*'):
					{
						A=S2.top();
						S2.pop();
						B=S2.top();
						S2.pop();
						A=A*B;
						S2.push(A);
						p++;
						break;
					}
				case('-'):
					{
						A=S2.top();
						S2.pop();
						B=S2.top();
						S2.pop();
						A=B-A;
						S2.push(A);
						p++;
						break;
					}
				}
		}
	}
	N=S2.top();
	
}
//Main:
int main(int arg,char* argv[])
{
	citire();
	
	polish();
	
	calc();
	
	afisare();
}