需要两个栈
其中一个栈 暂存操作数(左边 简称s1)
另外一个栈 暂存运算符(右边 简称s2)
从左到右 扫描中缀表达式
遇到操作数 入s1栈
遇到左括号 入s2栈
遇到运算符 准备入s2栈 入栈之前需要比较
若s2栈空或者s2栈的栈顶是左括号,则运算符直接入s2栈
若当前运算符 大于栈顶运算符优先级 则入s2栈
若当前运算符 小于等于栈顶运算符优先级 则s2栈 栈顶作出栈操作 直到大于栈顶运算符优先级 则将当前运算符 入s2栈
如果遇到右括号,则将s2栈 从栈顶到左括号的所有运算符均出栈
s2栈每出栈一个运算符 则 s1栈 出栈两个 操作数 进行一次运算(核心 )
第一次出栈的操作数在 运算符 右边
第二次出栈的操作数在 运算符 左边
并将运算结果入栈s1
当整个中缀表达式都扫描完之后,s2栈中依然有运算符,那么将所有运算符均出栈
最后在s1栈的栈顶就是整个表达式的求值结果
实现代码
priority n. 优先;优先权;[数] 优先次序;优先考虑的事
运算符规定为只有加减乘除
getPriority 判断运算符优先级
calSub 子表达式求值(出栈两个操作数 结合当前的运算符求值)
operand 操作数
operator 运算符
fabs() 对传入的float型参数取绝对值
MIN 是预先定义好的宏,是一个非常小的正数数值,小到与0非常接近
黄色的写法是判断opand2是否为0 的标准写法
调用函数时 先判断返回值是否为0 ,如果为0 没有计算出结果 如果为1
result参数里保存着计算结果
calculate
i. 计算;以为;作打算
vt. 计算;预测;认为;打算
expression
n. 表现,表示,表达;表情,脸色,态度,腔调,声调;式,符号;词句,语句,措辞,说法 ,表达式
假设 初始输入的表达式中的操作数都是1位数字
循环的判断条件是 !=‘\0’ 因为char[ ] 字符数组 结束符是 ‘\0’(就这么简单地认为吧 也别太钻)
怎么判断当前扫描到的字符是不是 数字(这里不准确 字符不会是数字 找到那些长得样子是数字) 判断是不是在字符’0‘ ~’9‘ 的ASCII码的范围里
字符型怎样存入float型的栈里
exp[i] - '0' 即可 得到整形
网友评论