Pagini recente » Cod sursa (job #1496342) | Cod sursa (job #1590886) | Cod sursa (job #1626935) | Cod sursa (job #445685) | Cod sursa (job #229613)
Cod sursa(job #229613)
#include<stdio.h>
#include<string.h>
char expr[100005];
char op[100005];
char stiva[100005];
int stack[100005];
int PF[100005];
char ord[300];
int contPF;
int i;
int top;
int Cifra(char t)
{
if ((t - '0' < 10) && (t - '0' >= 0)) return 1;
return 0;
}
int Semn(char t)
{
if ((t == '+') || (t == '*') || (t == '-') || (t == '/')) return 1;
return 0;
}
void Construct(char exp[])
{
int i = 0;
while (exp[i] != '`')
{
if (Cifra(exp[i]))
{
int p = 0;
while (Cifra(exp[i]))
{
p = p * 10 + exp[i] - '0';
i++;
}
i--;
PF[contPF++] = p;
}
else
if (exp[i] == '(')
stiva[++top] = exp[i];
else
if (exp[i] == ')')
{
while (stiva[top] != '(')
{
PF[contPF++] = stiva[top];
if (Semn(stiva[top])) op[contPF-1] = 1;
top--;
}
top--;
}
else
if (ord[exp[i]] > ord[stiva[top]]) stiva[++top] = exp[i];
else
if (ord[exp[i]] <= ord[stiva[top]])
{
while (ord[exp[i]] <= ord[stiva[top]])
{
PF[contPF++] = stiva[top];
if (Semn(stiva[top])) op[contPF-1] = 1;
top--;
}
stiva[++top] = exp[i];
}
i++;
if (exp[i] == '`')
{
while (top > 1)
{
PF[contPF++] = stiva[top];
if (Semn(stiva[top])) op[contPF-1] = 1;
top--;
}
}
}
}
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
stiva[0] = '-';
stiva[++top] = '`';
ord['*'] = 2;
ord['+'] = 1;
ord['-'] = 1;
ord['/'] = 2;
scanf("%s",&expr);
expr[strlen(expr)] = '`';
Construct(expr);
i = 0;
top = 0;
while (i < contPF)
{
if (op[i])
{
if (PF[i] == '*')
{
int E = stack[top] * stack[top-1];
top -= 2;
stack[++top] = E;
}
if (PF[i] == '/')
{
int E = stack[top-1] / stack[top];
top -= 2;
stack[++top] = E;
}
if (PF[i] == '+')
{
int E = stack[top] + stack[top-1];
top -= 2;
stack[++top] = E;
}
if (PF[i] == '-')
{
int E = stack[top-1] - stack[top];
top -= 2;
stack[++top] = E;
}
}
else
stack[++top] = PF[i];
i++;
}
printf("%d",stack[1]);
return 0;
}