Pagini recente » Cod sursa (job #3122967) | Cod sursa (job #1593207) | Cod sursa (job #3179533) | Cod sursa (job #1307479) | Cod sursa (job #2263938)
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
const int NMAX = 100000;
char op[NMAX / 2], s[NMAX + 5];
int polo[NMAX + 5];
int pr(char ch)
{
switch(ch)
{
case '+':return 1;
case '-':return 1;
case '*':return 2;
case '/': return 2;
default: return 0;
}
}
int main()
{
int n, toppolo = 0, i, topop = 0, num;
freopen ("evaluare.in", "r", stdin);
freopen ("evaluare.out", "w", stdout);
scanf("%s", s);
n = strlen(s);
i = 0;
while (i < n)
{
num = 0;
if (isdigit (s[i]))
{
num = num * 10 + s[i] - '0';
i++;
while (i < n && isdigit (s[i]))
{
num = num * 10 + s[i] - '0';
i++;
}
polo[++toppolo] = num;
i--;
}
else if (s[i] == '(')
{
op[++topop] = s[i];
}
else if (s[i] == ')')
{
while ((topop > 0) && op[topop] != '(')
{
switch (op[topop])
{
case '+': polo[toppolo - 1] += polo[toppolo]; break;
case '-': polo[toppolo - 1] -= polo[toppolo]; break;
case '*': polo[toppolo - 1] *= polo[toppolo]; break;
case '/': polo[toppolo - 1] /= polo[toppolo]; break;
}
topop--;
toppolo--;
}
topop--;
}
else if (topop == 0 || op[topop] == '(' || (pr(s[i]) > pr(op[topop])))
{
op[++topop] = s[i];
}
else
{
while (topop > 0 && pr(s[i]) <= op[topop])
{
switch (op[topop])
{
case '+': polo[toppolo - 1] += polo[toppolo]; break;
case '-': polo[toppolo - 1] -= polo[toppolo]; break;
case '*': polo[toppolo - 1] *= polo[toppolo]; break;
case '/': polo[toppolo - 1] /= polo[toppolo]; break;
}
topop--;
toppolo--;
}
op[++topop] = s[i];
}
i++;
}
while (topop > 0)
{
switch (op[topop])
{
case '+': polo[toppolo - 1] += polo[toppolo]; break;
case '-': polo[toppolo - 1] -= polo[toppolo]; break;
case '*': polo[toppolo - 1] *= polo[toppolo]; break;
case '/': polo[toppolo - 1] /= polo[toppolo]; break;
}
topop--;
toppolo--;
}
printf("%d", polo[1]);
return 0;
}