Pagini recente » Cod sursa (job #1029386) | Cod sursa (job #81937) | Cod sursa (job #2044448) | Cod sursa (job #2853313) | Cod sursa (job #1975664)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
inline int getPrioritate(char ch)
{
if (ch == '(') return -1;
if (ch == '+' || ch == '-') return 0;
if (ch == '*' || ch == '/') return 1;
}
vector<char>G;
deque<char>s;
deque<int>e;
string expr;
void Postfix(const string& expr)
{
for (int i = 0; i < expr.length(); ++i)
if (isdigit(expr[i]))
G.push_back(expr[i]);
else
{
G.push_back(' ');
if (expr[i] == '(')
s.push_back(expr[i]);
else
if (expr[i] == ')')
{
for(; s.back() != '('; G.push_back(s.back()),s.pop_back());
s.pop_back();
}
else
{
while(s.size() && getPrioritate(s.back()) > getPrioritate(expr[i]))
G.push_back(s.back()),s.pop_back();
s.push_back(expr[i]);
// cout << "S : " << expr[i] << "\n";
}
}
G.push_back(' ');
for (; !s.empty(); 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;
}