表达式求值
栈的应用—表达式求值
表达式通常由三部分组成:①操作数②运算符③界限符(括号等)
常见表达式有以下几种:
-
中缀表达式:、、、
特点:运算符在两个数中间
-
后缀表达式(逆波兰表达式):、、、
特点:运算符在两个操作数后面
-
前缀表达式(波兰表达式):、、、
特点:运算符在操作数前面
1. 中缀表达式转后缀方法
遵循左优先原则。
①确定运算顺序
②选择下一个运算符,按照 的方式组合成一个新的操作数
③如果还有运算符没被处理,继续②
如转换为后缀步骤:
2 后缀表达式计算
通过上面我们将中缀表达式转为后缀表达式
计算后缀表达式也不难:从左往右扫描,每遇到一个运算符,就让运算符前面最近的两个操作数执行对应运算
合体为一个操作数。注意:两个操作数的左右顺序。
步骤:
- 第一个运算符是,先算
- 第二个运算符是,
- 第三个运算符是,
- 第四个运算符是,
- 第五个运算符是,
- 第六个运算符是,
- 最后一个运算符是,得最后结果

3 代码实现
代码实现需要遵循以下几点:
①遇到操作数直接入栈
②遇到界限符'',直接入栈,遇到'',依次弹出栈内的运算符,直到栈顶元素为''。
③运算符运算弹出规则,应该是:操作符栈顶运算符大于或等于当前输入运算符则弹出栈顶操作符。数字栈依次弹出两个数字,运算是
Ⅰ.先分析运算符生效顺序,如下图:

Ⅱ. 从左到右依次扫描入栈:操作符栈(charStack),操作数栈(numStack)
Ⅲ. 定义操作符优先级:为,为,为.
Ⅳ. 进行扫描运算:
①输入'',由于操作符栈为,直接入栈。
②输入'',操作符栈不为,且优先级等于操作栈顶的元素'(',但由于括号不参与运算,所以直接入栈。
③输入,数字直接入栈。
④输入'',由于'÷'优先级低于操作符栈顶元素'(',直接入栈。
⑤输入'',括号直接入栈。
⑥输入,数字直接入栈。
⑦输入'',''y优先级低于操作符栈顶元素'',入栈。
⑧输入'',直接入栈
⑨输入,入栈
⑩输入'',''优先级低于操作符栈顶元素'',入栈
⑪输入,入栈。此时栈中元素情况如下:

⑫输入'',栈顶操作符一次出栈直到为NULL或者为''。此时弹出操作符栈顶元素'',弹出操作数栈前两个元素。之后运算得到新的数字重新放回操作栈顶部,再次执行弹出元素为'',这次运算结束。

⑬输入')',再次重复上面,弹出操作符栈顶元素'',弹出操作数栈两个元素,运算。得到新的数字重新放回操作栈顶部,再次执行弹出元素为'',这次运算结束。

⑭输入'',重复上面过程,弹出操作符栈顶元素'',弹出操作数栈两个元素,运算。得到新的数字重新放回操作栈顶部,再次执行弹出元素为'',这次运算结束。

⑮输入'',此时操作符栈顶元素为'',优先级低于栈顶元素,直接入栈。
⑯输入'',直接入栈

⑰输入'',弹出操作符栈顶元素'',弹出操作数栈两个元素,运算。得到新的数字重新放回操作栈顶部,再次执行弹出元素为'',这次运算结束。

⑱输入'',此时操作栈为NULL,直接入栈
⑲输入'',入栈
⑳输入,入栈
㉑输入'',优先级小于操作栈顶元素'',入栈
㉒输入'',直接入栈
㉓输入,入栈
㉔输入'',优先级低于操作栈栈顶元素'',入栈
㉕输入,入栈

㉖输入'',弹出操作符栈顶元素'',弹出操作数栈两个元素,运算。得到新的数字重新放回操作栈顶部,再次执行弹出元素为'',这次运算结束。

㉗输入'',弹出操作符栈顶元素'',弹出操作数栈两个元素,运算。得到新的数字重新放回操作栈顶部,再次执行弹出元素为'',这次运算结束。

㉘弹出操作栈顶元素'',弹出操作数栈两个元素进行最后运算,得到结果为
详细代码
更多知识内容点这里
__EOF__

本文链接:https://www.cnblogs.com/Acidm/p/17484246.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下