Pagini recente » Cod sursa (job #241069) | Cod sursa (job #99973) | Cod sursa (job #1996365) | Cod sursa (job #2806930) | Cod sursa (job #3203015)
// #include <iostream>
#include <fstream>
#include <string>
#include <stack>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
string a;
int i,n;
stack<long long>nr;
stack<char>op;
long long eval(long long a, long long b, char op)
{
switch (op)
{
case'+':return a + b;
case'-':return b - a;
case'*':return a * b;
case '/':return b / a;
default:
break;
}
}
int priority(char a, char b)
{
if (a == '(')
return 2;
if (a == '-' || a == '+' && b == '*' || b == '/')
return 2;
else return 1;
}
long long nextNum()
{
long long num = 0;
while (a[i] >= '0' && a[i] <= '9' && i < n)
num = num * 10LL + (a[i++] - '0');
return num;
}
int main()
{
getline(cin, a);
n = a.size();
while (i < n)
{
switch (a[i])
{
case'(':
{
op.push(a[i++]);
break;
}
case')':
{
while (op.top() != '(')
{
int num1 = nr.top();
nr.pop();
int num2 = nr.top();
nr.pop();
char c = op.top();
op.pop();
nr.push(eval(num1, num2, c));
}
op.pop();
i++;
break;
}
case'+':
case'-':
case'/':
case'*':
{
if (op.empty() || priority(op.top(), a[i]) == 2)
op.push(a[i++]);
else
{
do
{
int num1 = nr.top();
nr.pop();
int num2 = nr.top();
nr.pop();
char c = op.top();
op.pop();
nr.push(eval(num1, num2, c));
} while (!op.empty() && priority(op.top(), a[i]) == 1);
op.push(a[i++]);
}
break;
}
default: {nr.push(nextNum()); break; }
}
}
while (!op.empty())
{
int num1 = nr.top();
nr.pop();
int num2 = nr.top();
nr.pop();
char c = op.top();
op.pop();
nr.push(eval(num1, num2, c));
}
cout << nr.top();
return 0;
}