用栈求中缀表达式的值

需要两个栈
其中一个栈 暂存操作数(左边 简称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' 即可 得到整形

把’0‘~’9‘的字符转为0到9 只需要减去’0‘即可

你可能感兴趣的:(用栈求中缀表达式的值)