Pagini recente » Cod sursa (job #1535277) | Cod sursa (job #785803) | Cod sursa (job #35854) | Cod sursa (job #2943891) | Cod sursa (job #1745025)
#include <stdio.h>
#include <cstring>
#define NMax 100005
using namespace std;
int lpol;
char expr[NMax], pol[NMax];
char stk[NMax], st;
void polish(char *a, int n, char *b, int &m)
{
for (int i=0; i<n; ++i)
{
switch (a[i])
{
case '(':
stk[++st] = '('; break;
case ')':
while (stk[st]!='(')
{
b[m++]=' ', b[m++]=stk[st];
st--;
}
st--;
break;
case '*': case '/':
stk[++st] = a[i];
break;
case '+': case '-':
while (st && stk[st]!='(')
{
b[m++]=' ', b[m++]=stk[st];
st--;
}
stk[++st] = a[i];
break;
default:
b[m++]=' ';
for(;i<n && a[i]>='0' && a[i]<='9';++i)
b[m++]=a[i];
--i;
break;
}
}
while (st)
{
b[m++]=' ', b[m++]=stk[st];
st--;
}
}
int toNum(char *s)
{
int num = 0;
int l = strlen(s);
for(int i=0; i<l; ++i)
{
num = num*10 + (s[i]-'0');
}
return num;
}
int nums[NMax], nm;
int solvePol()
{
char *s;
s = strtok(pol, " ");
while (s != NULL)
{
if(!strchr("+-*/", s[0]))
nums[++nm] = toNum(s);
else
{
int v1, v2, r;
v1 = nums[nm]; nm--;
v2 = nums[nm]; nm--;
switch(s[0])
{
case '*': r = v1 * v2; nums[++nm]=r; break;
case '/': r = v2 / v1; nums[++nm]=r; break;
case '+': r = v1 + v2; nums[++nm]=r; break;
case '-': r = v2 - v1; nums[++nm]=r; break;
}
}
s = strtok(NULL, " ");
}
return nums[nm];
}
int main()
{
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
fgets(expr, sizeof(expr), stdin);
polish(expr, strlen(expr), pol, lpol);
printf("%d", solvePol());
return 0;
}