Pagini recente » Cod sursa (job #1412131) | Cod sursa (job #3217696) | Cod sursa (job #2574431) | Cod sursa (job #2784735) | Cod sursa (job #3293795)
#include <bits/stdc++.h>
using namespace std;
deque <string> postfixat(string &s)
{
map<string, int> prec;
prec["+"] = prec["-"] = 1;
prec["*"] = prec["/"] = 2;
prec["("] = -1;
long long nr = 0;
deque <string> rez, q;
for(int i = 0; s[i]; i ++)
{
if(s[i] <= '9' && s[i] >= '0')
{
while(s[i] <= '9' && s[i] >= '0')
{
nr = nr * 10 + s[i] - '0';
i ++;
}
i --;
rez.push_back(to_string(nr));
nr = 0;
}
else
{
string c;
c += s[i];
if(s[i] == '(')
q.push_back(c);
else if(s[i] == ')')
{
while(q.back() != "(")
rez.push_back(q.back()), q.pop_back();
q.pop_back();
}
else
{
while(!q.empty() && prec[c] <= prec[q.back()])
rez.push_back(q.back()), q.pop_back();
q.push_back(c);
}
}
}
while(!q.empty())
rez.push_back(q.back()), q.pop_back();
return rez;
}
long long eval(deque <string> p)
{
deque <int> q;
while(!p.empty())
{
string c = p.front();
p.pop_front();
if(c[0] >= '0' && c[0] <= '9')
q.push_back(stoi(c));
else
{
long long nr1 = q.back(); q.pop_back();
long long nr2 = q.back(); q.pop_back();
if(c[0] == '-')
q.push_back(nr2 - nr1);
else if(c[0] == '+')
q.push_back(nr2 + nr1);
else if(c[0] == '*')
q.push_back(nr2 * nr1);
else q.push_back(nr2 / nr1);
}
}
return q.back();
}
int main()
{
ifstream f("evaluare.in");
ofstream g("evaluare.out");
string str;
f >> str;
deque <string> q;
q = postfixat(str);
long long rez = eval(q);
g << rez;
return 0;
}