基于栈计算后缀表达式的值
2011-04-19 21:41
148 查看
计算机在处理算术表达式的时候,可将表达式先转换成后缀形式,然后利用栈进行计算。例如,表达式“46+5*(120-37)”的后缀表达式形式为“46 5 120 37 - * +”。
下面的函数computing(char expr[],int *result)的功能就是基于栈计算后缀形式的表达式(以串形式存入字符组expr)的值,并通过参数result带回该值。函数的返回值为-1/0,分别表示表达式有/无错误。假设表达式中仅包含数字、空格和算术运算符号,其中所有项均以空格分隔,且运算符仅包含加(“+”)、减(“-”)、乘(“*”)、除(“/”).
代码:
下面的函数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; } }
相关文章推荐
- 【转】算术表达式中缀形式转后缀形式,并基于后缀式和栈进行计算
- 中缀表达式转后缀表达式,并计算后缀表达式值
- 栈应用之中缀转后缀表达式计算(C++、JAVA)
- 算术表达式的计算(基于逆波兰表达式)的c++实现
- 中缀表达式与后缀表达式的转化与计算
- 不用后缀表达式进行表达式计算(加、减、乘、除、整除、取余、指数)
- 【叶子函数分享十七】中缀算术转后缀算术表达式并计算的函数
- 基础代码-计算后缀表达式
- 中缀表达式转换成后缀表达式 计算后缀表达式的值 幂操作符添加到你的指令系统中去
- 中缀表达式转后缀表达式并进行计算 原理
- 从键盘上输入一个后缀表达式,试编写算法计算表达式的值。规定:逆波兰表达式的长度不超过一行,以$符作为输入结束,操作数之间用空格分隔,操作符只可能有+、-、*、/四种运算。例如:234 34+2*$。
- 算式类型字符串表达式读取并计算出结果(简单四则运算)--后缀表达式计算
- 利用顺序栈计算后缀表达式(逆波兰表达式)
- 图解后缀表达式的计算过程
- 中缀表达式转后缀表达式并计算结果
- 图解后缀表达式的计算过程
- 后缀表达式的计算
- C语言实现括号匹配,中缀表达式转后缀表达式并计算的算法
- 中缀表达式转为后缀表达式以及后缀表达式的计算
- 八、通过中缀计算表达式转换成后缀计算表达式