1 中缀表达式转后缀表达式

1.1 宏观思路

去掉所有符号,根据运算顺序添加运算符

1.2 微观实现

定义\(\#%\)等级为0(自定义),\(+\)等级为1,\(\times\)等级为2(其他种类运算符同理)

\(\#%\),在中缀表达式后加\(\#\)(注:栈维护运算符本身和其优先级的二元组,保持二元组的第二项从栈底到栈顶单调递增,遇到和栈顶同样的运算符都要弹出)

指针从左到右扫描中缀表达式,遇到数字直接输出,遇到运算符就将运算符和其原本优先级等级+\(f\)(见下)入栈。(一定注意要维护栈的单调性,出栈的运算符直接输出

维护一个初值为\(0\)整型标记变量\(f\)用于维护括号层数对于运算符优先级等级的贡献,具体地,选取一个大于优先级最高运算符等级的数\(\Delta f\)。(例如在本例中,可以选取\(\Delta f=10\))遇到左括号将\(f+=\Delta f\),遇到右括号将\(f-=\Delta f\),如上所述,让运算符入栈的同时记录原本等级\(+f\)

指针到底后输出栈顶并弹栈直到栈为空。

时间复杂度\(O(n)。\)

其实我至今都不知道井号的作用是什么。

2 后缀表达式求值

从左到右扫描后缀表达式,遇到数字入栈,遇到运算符询问并弹出栈顶两个元素并计算,将计算结果再次入栈。

扫描到底时栈中唯一元素即为表达式的值。

时间复杂度\(O(n)\)

原文地址:http://www.cnblogs.com/KimJeonghui/p/16858946.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性