Pagini recente » Cod sursa (job #2115343) | Cod sursa (job #3201861) | Cod sursa (job #238937) | Cod sursa (job #1640015) | Cod sursa (job #1745018)
#include <stdio.h>
#include <cstring>
#include <stack>
#include <queue>
#define NMax 100005
using namespace std;
int lpol;
char expr[NMax], pol[NMax];
stack<char> stk;
void polish(char *a, int n, char *b, int &m)
{
for (int i=0; i<n; ++i)
{
switch (a[i])
{
case '(':
stk.push('('); break;
case ')':
while (stk.top()!='(')
{
b[m++]=' ', b[m++]=stk.top();
stk.pop();
}
stk.pop();
break;
case '*': case '/':
stk.push(a[i]);
break;
case '+': case '-':
while (!stk.empty() && stk.top()!='(')
{
b[m++]=' ', b[m++]=stk.top();
stk.pop();
}
stk.push(a[i]);
break;
default:
b[m++]=' ';
for(;i<n && a[i]>='0' && a[i]<='9';++i)
b[m++]=a[i];
--i;
break;
}
}
while (!stk.empty())
{
b[m++]=' ', b[m++]=stk.top();
stk.pop();
}
}
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;
}
stack<int> nums;
int solvePol()
{
char *s;
s = strtok(pol, " ");
while (s != NULL)
{
if(!strchr("+-*/", s[0]))
nums.push(toNum(s));
else
{
int v1, v2, r;
v1 = nums.top(); nums.pop();
v2 = nums.top(); nums.pop();
switch(s[0])
{
case '*': r = v1 * v2; nums.push(r); break;
case '/': r = v2 / v1; nums.push(r); break;
case '+': r = v1 + v2; nums.push(r); break;
case '-': r = v2 - v1; nums.push(r); break;
}
}
s = strtok(NULL, " ");
}
return nums.top();
}
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;
}