Cod sursa(job #2579800)

Utilizator TudorChirila11Tudor Chirila TudorChirila11 Data 12 martie 2020 20:26:06
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
#define st first
#define nd second
#define pb push_back
#define N 200005
using namespace std;
typedef long long ll;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int n, m, i, j, dg;
char s[N];
stack<int> val;
stack<char> op;
int fa(int x, char semn, int y)
{
	if(semn=='+')
		return x+y;
	else if(semn=='-')
		return y-x;
	else if(semn=='*')
		return x*y;
	else return y/x;
}
int pred(char semn)
{
	if(semn=='*'||semn=='/')
		return 2;
	else if(semn=='+'||semn=='-')return 1;
	return 0;
}
int main()
{
	fin>>s;
	n=strlen(s);
	for(i=0;i<n;++i)
	{
		if(s[i]>='0'&&s[i]<='9')
		{
			if(dg==-1)
				dg=0;
			dg=dg*10+s[i]-'0';
			continue;
		}
		if(dg>-1)
		{
			val.push(dg);
			dg=-1;
		}
		if(s[i]=='(')
			op.push('(');
		else if(s[i]==')')
		{
			while(op.top()!='(')
			{
				int x=val.top();
				val.pop();
				int y=val.top();
				val.pop();
				val.push(fa(x,op.top(),y));
				op.pop();
			}
			op.pop();
		}
		else
		{
			while(!op.empty()&&pred(op.top())>=pred(s[i]))
			{
				int x=val.top();
				val.pop();
				int y=val.top();
				val.pop();
				val.push(fa(x,op.top(),y));
				op.pop();
			}
			op.push(s[i]);
		}
	}
	if(dg>-1)
		val.push(dg);
	while(!op.empty())
	{
		int x=val.top();
		val.pop();
		int y=val.top();
		val.pop();
		cout<<x<<' '<<y<<'\n';
		val.push(fa(x,op.top(),y));
		op.pop();	
	}
	fout<<val.top();
}