基于栈计算后缀表达式的值

计算机在处理算术表达式的时候,可将表达式先转换成后缀形式,然后利用栈进行计算。例如,表达式“46+5*(120-37)”的后缀表达式形式为“46 5 120 37 - * +”。

下面的函数computing(char expr[],int *result)的功能就是基于栈计算后缀形式的表达式(以串形式存入字符组expr)的值,并通过参数result带回该值。函数的返回值为-1/0,分别表示表达式有/无错误。假设表达式中仅包含数字、空格和算术运算符号,其中所有项均以空格分隔,且运算符仅包含加(“+”)、减(“-”)、乘(“*”)、除(“/”).

代码:

int computing(char expr[],int *result) { STACK s; int tnum,a,b; char *ptr; InitStack(&s); ptr=expr; /*字符指针指向后缀表达式串的第一个字符*/ while(*ptr!='/0'){ /*当前字符是空格,则取下一字符*/ if(*ptr==''){ ptr++;continue; }else if(isdigit(*ptr)){ /*当前字符是数字,则将数字串转换为数值*/ tnum=0; while(*ptr>='0'&&*ptr<='9'){ tnum=tnum*10+*ptr-'0'; ptr++; } Push(&s,tnum); } else /*当前字符是运算符或其他符号*/ if(*ptr=='+'||*ptr=='-'||*ptr=='*'||*ptr=='/'){ if(!IsEmpty(s)){ a=Top(s);Pop(&s); /*取运算符的第二个运算数*/ if(!IsEmpty(s)){ b=Top(s);Pop(&s); /*取运算符的第一个运算数*/ } else return -1; } else return -1; switch(*ptr){ case '+':Push(&s,b+a); break; case '-':Push(&s,b-a); break; case '*':Push(&s,b*a); break; case '/':Push(&s,b/a); break; } } else return -1; /*非法字符*/ ptr++; /*取下一个字符*/ }/*while*/ if(IsEmpty(s)) return -1; else{ *result=Top(s); Pop(&s); /*取运算结果*/ if(!IsEmpty(s)) return -1; return 0; } }

你可能感兴趣的:(基于栈计算后缀表达式的值)