Pagini recente » Cod sursa (job #2566453) | Cod sursa (job #1011360) | Cod sursa (job #2165195) | Cod sursa (job #1966789) | Cod sursa (job #2278586)
#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());
}