Cod sursa(job #770729)

Utilizator NicuCJNicu B. NicuCJ Data 23 iulie 2012 18:24:09
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.97 kb
#include <fstream>
#include <stack>
#include <queue>
using namespace std;
stack <char> stiva;
queue <int> coada;
stack <int> stiva2;
char x[200005];
int main()
{
	ifstream f("evaluare.in");
	ofstream g("evaluare.out");
	int i, nr=0;
	f.getline(x, 200005);
	int p=strlen(x);
	for(i=0; i<p; i++)
	{
		bool ok=false;
		while(isdigit(x[i]))
		{
			nr=nr*10+(x[i]-48);
			ok=true;
			i++;
		}
		if(ok)
		{
			coada.push(nr);
			nr=0;
			ok=false;
		}
		if(!isdigit(x[i]))
		{
			if(x[i]=='+' || x[i]=='-')
			{
			if(!stiva.empty())
			{
				if(stiva.top()=='+')
				{
					coada.push(1000000001);
					stiva.pop();
					stiva.push(x[i]);
				}
				else if(stiva.top()=='-')
				{
					coada.push(1000000002);
					stiva.pop();
					stiva.push(x[i]);
				}
				else
				{
					if(stiva.top()=='*')
					{
						coada.push(1000000003);
						stiva.pop();
						stiva.push(x[i]);
					}
					else if(stiva.top()=='/')
					{
						coada.push(1000000004);
						stiva.pop();
						stiva.push(x[i]);
					}
					else
						stiva.push(x[i]);
					//stiva.push(x[i]);
				}
			}
			else
				stiva.push(x[i]);
			}
			else if(x[i]=='*' || x[i]=='/')
			{
				if(!stiva.empty())
				{
					if(stiva.top()=='*')
					{
						coada.push(1000000003);
						stiva.pop();
						stiva.push(x[i]);
					}
					else if(stiva.top()=='/')
					{
						coada.push(1000000004);
						stiva.pop();
						stiva.push(x[i]);
					}
					else
						stiva.push(x[i]);
				}
				else
					stiva.push(x[i]);
			}
			else if(x[i]=='(')
				stiva.push(x[i]);
			else if(x[i]==')')
			{
				while(!stiva.empty() && stiva.top()!='(')
				{
					if(stiva.top()=='+')
						coada.push(1000000001);
					if(stiva.top()=='-')
						coada.push(1000000002);
					if(stiva.top()=='*')
						coada.push(1000000003);
					if(stiva.top()=='/')
						coada.push(1000000004);
					stiva.pop();
				}
				stiva.pop();
			}
		}
	}
	while(!stiva.empty())
	{
		if(stiva.top()=='+')
			coada.push(1000000001);
		if(stiva.top()=='-')
			coada.push(1000000002);
		if(stiva.top()=='*')
			coada.push(1000000003);
		if(stiva.top()=='/')
			coada.push(1000000004);
		stiva.pop();
	}
	while(!coada.empty())
	{
		if(coada.front()<=1000000000)
			stiva2.push(coada.front());
		else
		{
			if(coada.front()==1000000001)
			{
				int x1=stiva2.top();
				stiva2.pop();
				int x2=stiva2.top();
				stiva2.pop();
				stiva2.push(x1+x2);
			}
			if(coada.front()==1000000002)
			{
				int x1=stiva2.top();
				stiva2.pop();
				int x2=stiva2.top();
				stiva2.pop();
				stiva2.push(x2-x1);
			}
			if(coada.front()==1000000003)
			{
				int x1=stiva2.top();
				stiva2.pop();
				int x2=stiva2.top();
				stiva2.pop();
				stiva2.push(x1*x2);
			}
			if(coada.front()==1000000004)
			{
				int x1=stiva2.top();
				stiva2.pop();
				int x2=stiva2.top();
				stiva2.pop();
				stiva2.push(x2/x1);
			}
		}
		coada.pop();
	}
	g<<stiva2.top();
}