实现思想:
(1)遇到数字就放在栈中
(2)遇到运算符就从栈中取出数字,上面的数字放在运算符右边,下面的数字放在运算符左边
(3)运算结果再放在栈中,最后栈中余下的数为运算结果
int Compute(stack *s,char *str)
{
char *p=str;
int right;//存放右操作数
int left;//左操作数
while(*p != '\0')
{
if(isdigit(*p)) //如果是数字则存放在栈中
{
s->elem[s->top++] = *p;
}
else if(*p == '+')//是运算符时则取出数字计算后再放到栈中
{
right = s->elem[--s->top]-48;//由于放在栈中的数字是以ASCII码形式保存,运算时是以10进制计算的,因此计算时-48转换为10进制
left = s->elem[--s->top]-48;
s->elem[s->top++] = left + right+48;//由于保存在栈中的数最后还要拿出来和ASCII计算,为了和上面的-48统一,这里再转换为ASCII码
}
else if(*p == '-')
{
right = s->elem[--s->top]-48;
left = s->elem[--s->top]-48;
s->elem[s->top++] = left - right+48;
}
else if(*p == '*')
{
right = s->elem[--s->top]-48;
left = s->elem[--s->top]-48;
s->elem[s->top++] = left * right+48;
}
else if(*p == '/')
{
right = s->elem[--s->top]-48;
left = s->elem[--s->top]-48;
s->elem[s->top++] = left / right+48;
}
p++;
}
s->elem[--s->top]-=48;//注意最后栈中的一个数是计算结果,Pop出来时应该转换为相应的10进制
return s->elem[--s->top-1];
}