Cod sursa(job #1751366)

Utilizator bogdanluncasubogdan bogdanluncasu Data 1 septembrie 2016 12:07:02
Problema Evaluarea unei expresii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.61 kb
#include <iostream>
#include<stack>
#include<math.h>
#include<string.h>
using namespace std;
stack<char> operators;
stack<long long> factors;
void afiseaza(stack<long long > v){
	while(!v.empty()){
		long long a=v.top();
		v.pop();
		printf("%d ",a);
	}
	
}
void solve_op_prcedence(){
	while(!operators.empty()&&(operators.top()=='*'||operators.top()=='/')){
		char op=operators.top();
		operators.pop();
		long long  f1=factors.top();
		factors.pop();
		long long  f2=factors.top();
		factors.pop();
		switch(op){
			case '*':factors.push(f1*f2);break;
			case '/':factors.push(f2/f1);
		}
	}
}

void solve_op_bracket(){
	while(operators.top()!='('){
		char op=operators.top();
		operators.pop();
		long long  f1=factors.top();
		factors.pop();
		long long  f2=factors.top();
		factors.pop();
		switch(op){
			case '*':factors.push(f1*f2);break;
			case '/':factors.push(f2/f1);break;
			case '+':factors.push(f1+f2);break;
		}
	}
	operators.pop();
}
void solve_rest(){
	while(!operators.empty()){
		char op=operators.top();
		operators.pop();
		long long  f1=factors.top();
		factors.pop();
		long long  f2=factors.top();
		factors.pop();
		//cout<<f2<<op<<f1<<endl;
		switch(op){
			case '*':factors.push(f1*f2);break;
			case '/':factors.push(f2/f1);break;
			case '+':factors.push(f1+f2);break;
		}
	}
}
int main() {
	freopen("evaluare.in", "r", stdin);
	freopen("evaluare.out", "w", stdout);
	char* w=(char*)malloc(100000);
	scanf("%s",w);
	int j,last=0,opened=0;
	for(int i=0;i<strlen(w);i++){
		//cout<<w[i]<<" "<<i<<endl;
		//afiseaza(factors);
		switch(w[i]){
			case '*':if(!operators.empty()&&operators.top()=='/')solve_op_prcedence();
			operators.push(w[i]);break;
			case '/':operators.push(w[i]);break;
			case '+':
			if(!operators.empty())
			if((operators.top()=='*'||operators.top()=='/'))solve_op_prcedence();
			operators.push(w[i]);break;
			case '-':
			if(!operators.empty()&&(operators.top()=='*'||operators.top()=='/'))solve_op_prcedence();
			operators.push('+');last=1;break;
			case '(':if(last==1)opened++;operators.push(w[i]);break;
			case ')':if(last==1)opened--;last=opened%2==0?0:1;
			solve_op_bracket();break;
			default:
			long long n=(w[i]-'0');
			for(j=i+1;j<strlen(w);j++){
				if(w[j]!='*'&&w[j]!='/'&&w[j]!='+'&&w[j]!='-'&&w[j]!='('&&w[j]!=')'){
					n=n*10+(w[j]-'0');
				}
				else{
					break;
				}
			}
			i=j-1;
			if(last==1&&opened%2==1){
				//cout<<n<<"n"<<endl;
				n=-n;
			}else if(last==1&&opened==0){
				last=0;
				n=-n;
			}
			factors.push(n);
		}
	}
	solve_rest();
	afiseaza(factors);
	
}