Pagini recente » Cod sursa (job #2168336) | Cod sursa (job #484183) | Cod sursa (job #514854) | Cod sursa (job #1701258) | Cod sursa (job #1975751)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
vector<int>number;
deque<char>s;
int isOperator(char a){
return a == '+' || a == '/' || a == '*' || a == '-';
}
int getPriority(char a)
{
if ( a == '(')
return 0;
if (a == '+' || a == '-')
return 1;
if (a == '*' || a == '/')
return 2;
}
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;
}
return 0;
}
void emptyStack()
{
while (s.size())
{
if (s.back() == '(')
return;
int n1 = number.back(); number.pop_back();
int n2 = number.back(); number.pop_back();
number.push_back(doMath(n2,n1,s.back()));
s.pop_back();
}
}
void solve(const string &expr)
{
for (int i = 0; expr[i]; ++i)
if (isdigit(expr[i]))
{
int n1 = 0;
for (; isdigit(expr[i]);n1 = n1 * 10 + (expr[i]-'0'),++i);
--i;
number.push_back(n1);
continue;
}
else
if(expr[i] == '(')
s.push_back(expr[i]);
else
if (expr[i] == ')')
{
emptyStack();
s.pop_back();
}
else
if ( isOperator(expr[i]) )
{
while (s.size() && getPriority(s.back()) >= getPriority(expr[i]))
{
int n1 = number.back(); number.pop_back();
int n2 = number.back(); number.pop_back();
number.push_back(doMath(n2,n1,s.back()));
s.pop_back();
}
s.push_back(expr[i]);
}
emptyStack();
}
int main()
{
string expr;
fin >> expr;
solve(expr);
fout << number[0];
return 0;
}