Pagini recente » Cod sursa (job #2192710) | Cod sursa (job #850745) | Cod sursa (job #640294) | Cod sursa (job #706277) | Cod sursa (job #1975607)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
vector<char>G;
deque<char>s;
deque<int>e;
string expr;
void Postfix(const string &expr)
{
for (int i = 0; expr[i]; ++i)
if (isdigit(expr[i]))
G.push_back(expr[i]);
else
{
G.push_back(' ');
if (expr[i] == '(' || expr[i] == '*' || expr[i] == '/')
s.push_back(expr[i]);
else
if (expr[i] == ')')
{
char ch = s.back();
while (ch != '(' && s.size())
{
G.push_back(ch);
s.pop_back();
ch = s.back();
}
if (s.size())
s.pop_back();
}
else
if (expr[i] == '-' || expr[i] == '+')
{
char ch = s.back();
while (ch == '*' || ch == '/' && s.size())
{
G.push_back(ch);
s.pop_back();
ch = s.back();
}
s.push_back(expr[i]);
}
}
G.push_back(' ');
for (; s.size(); G.push_back(s.back()),s.pop_back());
}
inline int doMath(int a, int b, char ch)
{
switch(ch)
{
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
default: return 0;
}
}
int calculate()
{
int number = 0;
for (int i = 0 ; i < G.size(); ++i)
if (isdigit(G[i]))
number = number * 10 + (G[i] - '0');
else
if (G[i] == ' ')
{
if (number)
e.push_back(number),number = 0;
}
else
{
int el1 = e.back(); e.pop_back();
int el2 = e.back(); e.pop_back();
e.push_back(doMath(el2,el1,G[i]));
}
return e.back();
}
int main()
{
fin >> expr;
Postfix(expr);
fout << calculate();
return 0;
}