Cod sursa(job #2061669)

Utilizator adi1607Ciurea Adi adi1607 Data 9 noiembrie 2017 16:46:02
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 3.41 kb
#include <fstream>
#include <cctype>
#include <cstring>
#include <vector>
#include <stack>
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
char s[10001];
vector<int>polo;
stack<char>op;
inline int prior(char ch)
{
	switch(ch)
	{
		case'*':
		case'/':
		case'%':return 2;
		case'+':
		case'-':return 1;
		default:return 0;
	}
}
int main()
{
    in.getline(s,10001);
    int n,i,a,b;
    n=strlen(s);
    int nr=0,number=0;
    for(i=0;i<n;i++)
    {

    	if(isdigit(s[i]))
    	{
    		nr=nr*10+s[i]-'0';
    		number=1;
    		continue;
    	}
    	else if(number==1)
			{
				polo.push_back(nr);
				nr=0;
				number=0;
			}
    	if(s[i]=='(')
			{
				op.push(s[i]);
				continue;
			}
			if(s[i]==')')
			{
				while(!op.empty() && op.top()!='(')
						{
							switch(op.top())
							{
								case '+':a=polo.back();
										polo.pop_back();
										b=polo.back();
										polo.pop_back();
										polo.push_back(a+b);
										break;
								case '-':a=polo.back();
										polo.pop_back();
										b=polo.back();
										polo.pop_back();
										polo.push_back(b-a);
										break;
								case '*':a=polo.back();
										polo.pop_back();
										b=polo.back();
										polo.pop_back();
										polo.push_back(a*b);
										break;
								case '/':a=polo.back();
										polo.pop_back();
										b=polo.back();
										polo.pop_back();
										polo.push_back(b/a);
										break;
							}
							op.pop();
						}
				op.pop();
				continue;		
			}
			if(op.empty() || prior(s[i])>prior(op.top()))
				op.push(s[i]);
				else
				{
					while(!op.empty() && prior (s[i])<=prior(op.top()))
					{
						switch(op.top())
							{
								case '+':a=polo.back();
										polo.pop_back();
										b=polo.back();
										polo.pop_back();
										polo.push_back(a+b);
										break;
								case '-':a=polo.back();
										polo.pop_back();
										b=polo.back();
										polo.pop_back();
										polo.push_back(b-a);
										break;
								case '*':a=polo.back();
										polo.pop_back();
										b=polo.back();
										polo.pop_back();
										polo.push_back(a*b);
										break;
								case '/':a=polo.back();
										polo.pop_back();
										b=polo.back();
										polo.pop_back();
										polo.push_back(b/a);
										break;
							}
						op.pop();
						
					}
					op.push(s[i]);
				}
    }
    if(number==1)
			{
				polo.push_back(nr);
				nr=0;
				number=0;
			}
    while(!op.empty())
    {
    	switch(op.top())
							{
								case '+':a=polo.back();
										polo.pop_back();
										b=polo.back();
										polo.pop_back();
										polo.push_back(a+b);
										break;
								case '-':a=polo.back();
										polo.pop_back();
										b=polo.back();
										polo.pop_back();
										polo.push_back(b-a);
										break;
								case '*':a=polo.back();
										polo.pop_back();
										b=polo.back();
										polo.pop_back();
										polo.push_back(a*b);
										break;
								case '/':a=polo.back();
										polo.pop_back();
										b=polo.back();
										polo.pop_back();
										polo.push_back(b/a);
										break;
							}
    	op.pop();
    }
    
			
    vector<int>:: iterator it;
    for(it=polo.begin();it<polo.end();it++)
		out<<*it;
    return 0;
}