您的位置:首页 > 其它

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

2011-04-19 21:41 148 查看
计算机在处理算术表达式的时候,可将表达式先转换成后缀形式,然后利用栈进行计算。例如,表达式“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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐