Cod sursa(job #2278586)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 8 noiembrie 2018 11:46:30
Problema Evaluarea unei expresii Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
#include <fstream>
#include <vector>
#include <bitset>
#include <unordered_map>
#include <algorithm>
#include <queue>
#include <math.h>
#include <iomanip>
#include <stack>
#include <string.h>
  
using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");

stack <char> s;

unordered_map <char, int> priority;

typedef pair <int, int> pii;
#define pb push_back

stack <pii> numbers;
stack <pii> operators;

vector <pii> rpn;

void init()
{
	priority['+'] = 1;
	priority['-'] = 1;
	priority['*'] = 2;
	priority['/'] = 2;
}

main()
{
	init();
	
	bool last = 1;
	
	string forParse;
	f >> forParse;
	
	int k = 0;
	
	int nr = -1;
	
	for(auto i : forParse)
	{
		if(isdigit(i))
		{
			if(nr == -1)
				nr = 0;
			nr = nr * 10 + i - '0';
		}
		else
		{
			if(nr != -1)
			{
				rpn.pb({nr, 0});
				nr = -1;
			}
			
			if(i == '(')
				s.push(i);
			else
				if(i == ')')
				{
					while(s.top() != '(')
					{
						rpn.pb({s.top(), 1});
						s.pop();
					}
					
					s.pop();
				}
				else
				{
					while(!s.empty() && priority[s.top()] >= priority[i])
					{
						rpn.pb({s.top(), 1});
						s.pop();
					}
					
					s.push(i);
				}
		}
	}
	
	if(nr != -1)
		rpn.pb({nr, 0});
	
	while(!s.empty())
	{
		rpn.pb({s.top(), 1});
		s.pop();
	}
	
	for(auto i : rpn)
		if(i.second == 0)
			s.push(i.first);
		else
		{
			int p2 = s.top();
			s.pop();
			int p1 = s.top();
			s.pop();
			
			switch(char(i.first))
			{
				case('+'): s.push(p1 + p2); break;
				case('-'): s.push(p1 - p2); break;
				case('*'): s.push(p1 * p2); break;
				case('/'): s.push(p1 / p2); break;
			}
		}
	g << int(s.top());
}