#include "./stack/stack.h"
#include<stdlib.h>
SElemType Precede(SElemType t1, SElemType t2)
{
SElemType f;
switch(t2)
{
case '+':
case '-':
if(t1 == '(' || t1 == '=')
f = '<';
else
f = '>';
break;
case '*':
case '/':
if(t1 == '*' || t1 == '/' || t1 == ')')
f = '>';
else
f = '<';
break;
case '(':
if(t1 == ')')
{
printf("ERROR\n");
exit(ERROR);
}
else
{
f = '<';
}
break;
case ')':
switch(t1)
{
case '(': f='=';
break;
case '=':printf("ERROR\n");
exit(ERROR);
default:
f = '>';
}
break;
case '=':
switch(t1)
{
case '=': f='=';
break;
case '(':
printf("ERROR\n");
exit(ERROR);
default:
f = '>';
}
}
return f;
}
Status In(SElemType c)
{
switch (c)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '=':
return TRUE;
default:
return FALSE;
}
}
SElemType Operate(SElemType a, SElemType theta, SElemType b)
{
SElemType c;
switch (theta)
{
case '+':
c = a + b;
break;
case '-':
c = a - b;
break;
case '*':
c = a * b;
break;
case '/':
c = a / b;
break;
}
return c;
}
SElemType EvalueteExpresion()
{
SqStack OPTR,OPND;
SElemType a, b, d, x, theta;
char c;
char z[6];
int i;
InitStack(OPTR);
Push(OPTR, '=');
InitStack(OPND);
c = getchar();
GetTop(OPTR, x);
while(c != '=' || x != '=')
{
if(In(c))
{
switch (Precede(x, c))
{
case '<': Push(OPTR,c);
c = getchar();
break;
case '=': Pop(OPTR,x);
c = getchar();
break;
case '>':
Pop(OPTR, theta);
Pop(OPND, b);
Pop(OPND, a);
Push(OPND, Operate(a, theta, b));
break;
}
}
else if(c >= '0' && c <= '9')
{
i = 0;
do{
z[i++] = c;
c = getchar();
}while(c >= '0' && c <= '9');
z[i] = '\0';
d = atoi(z);
Push(OPND, d);
}
else
{
printf("ERROR\n");
exit(ERROR);
}
GetTop(OPTR, x);
}
GetTop(OPND, x);
return x;
}
int main()
{
printf("请输入算术表达式,负数要(0-正数),并以=结束\n");
printf("%d\n",EvalueteExpresion());
return 0;
}
输入四则运算表达式字符串,计算该表达式的值(计算中间结果和最后结果范围为int类型)