Cod sursa(job #1475823)

Utilizator dimavascan94VascanDumitru dimavascan94 Data 24 august 2015 12:54:34
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <vector>
#include <string.h>
#include <iostream>
using namespace std;

string inf;
vector<char> post,stack;
vector<int> nrStack;
int i;

int lessOrEqualPrec(char stackChar,char newChar)
{
	if ((newChar=='+' || newChar=='-') || (stackChar=='*' || stackChar=='/'))
		return true;
	else
		return false;
}

int main()
{	
		cin>>inf;
		int size=inf.size();
		for (i=0;i<size;++i)
		{
			if(inf[i]<='9' && inf[i]>='0')
			{
				while(inf[i]<='9' && inf[i]>='0')
				{
					post.push_back(inf[i++]);
				}
				i--;
				post.push_back(' ');
			}
			else if(inf[i]=='(')
			{
				stack.push_back(inf[i]);
			}
			else if(inf[i]==')')
			{
				while(stack.size()>0 && stack.at(stack.size()-1)!='(')
				{
					post.push_back(stack.at(stack.size()-1));
					stack.pop_back();
				}
				stack.pop_back();
			}
			else
			{
				if(stack.size()>0)
				{
					while( stack.size()>0 && stack.at(stack.size()-1)!='(' && lessOrEqualPrec(stack.at(stack.size()-1),inf[i])	)
					{
						post.push_back(stack.at(stack.size()-1));
						stack.pop_back();		
					}
				}
				stack.push_back(inf[i]);
			}
		}
		
		while(stack.size()>0)
		{
			post.push_back(stack.at(stack.size()-1));
			stack.pop_back();	
		}
		
		int nmb1,nmb2;
		char op;
		size=post.size();
		while(post.size()>0)
		{
			if (post.at(0)>='0' && post.at(0)<='9')
			{
				int nmb=0;
				nmb+=post.at(0)-'0';
				post.erase(post.begin());
				while(post.at(0)!=' ')
				{
					nmb*=10;
					nmb+=post.at(0);
					post.erase(post.begin());
				}
				post.erase(post.begin());
				nrStack.push_back(nmb);
			}
			else
			{
				op=post.at(0);
				post.erase(post.begin());
				int nmb2=nrStack.at(nrStack.size()-1);
				nrStack.pop_back();
				int nmb1=nrStack.at(nrStack.size()-1);
				nrStack.pop_back();
				if (op=='+')
				{
					nrStack.push_back(nmb1+nmb2);
				}	
				else if (op=='-')
				{
					nrStack.push_back(nmb1-nmb2);
				}
				else if (op=='*')
				{
					nrStack.push_back(nmb1*nmb2);
				}
				else if (op=='/')
				{
					nrStack.push_back(nmb1/nmb2);
				}
			}
		}
		
		cout<<nrStack.at(0);		
}