美文网首页
用栈求中缀表达式的值

用栈求中缀表达式的值

作者: sakura579 | 来源:发表于2020-08-23 09:35 被阅读0次

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

相关文章

  • 用栈求后缀表达式的值

    类似于用栈求中缀表达式 不同的是 这里只需要一个栈 这个是在中缀表达式上改写的 借鉴 这个是for循环因为i每次循...

  • 用栈求中缀表达式的值

    需要两个栈其中一个栈 暂存操作数(左边 简称s1)另外一个栈 暂存运算符(右边 简称s2) 从左到右 扫描中缀...

  • 计算器

    使用Java写的一个可以计算+,-,*,/ 的计算器。首先用栈把中缀表达式转化成后缀表达式,再利用栈对后缀表达式求...

  • 栈和队列

    一.栈 栈的作用之一:利用栈后进先出的特点匹配括号,计算带运算符的算法(也就是中缀表达式) 可以把中缀表达式转化为...

  • 数据结构与算法--后缀表达式

    中缀表达式转后缀表达式 中缀表达式转后缀表达式的思路步骤分析。 初始化一个栈和一个队列,运算符栈 S1 和存储中间...

  • 中缀表达式

    学习算法,开始想到用栈了,但是没有解决优先级的问题。上网一查,原来中缀表达式更适合计算机阅读,转换成中缀表达式后,...

  • Python 简单计算器-逆波兰后缀表达式实现

    中缀表达式 后缀表达式 简易计算器,可以通过栈来实现。然而如果直接使用中缀表达式,需要处理括号,而使用后缀表达式则...

  • 利用栈将中缀表达式转为后缀表达式

    利用栈将中缀表达式转为后缀表达式 算法思想 顺序扫描中缀表达式(可以存储在字符数组中) 判断当前元素类型:如果是数...

  • 2017/3/13 周一

    GET 栈1.顺序栈/链式栈2.栈的递归用法3.栈的四则运算表达式求值(中缀表示法、后缀表示法)4.Java用St...

  • 逆波兰表达式

    求表达式(1 - 2) * (4 + 5)的值 人类早就熟悉这种中缀表达式的计算公式,随便拉一个小朋友过来,他就直...

网友评论

      本文标题:用栈求中缀表达式的值

      本文链接:https://www.haomeiwen.com/subject/lmdpjktx.html