中缀表达式转换为后缀表达式数据结构

一、基本概念
1、中缀表达式:
操作符以中缀形式位于运算数中间(如:3+2),是我们日常通用的算术和逻辑公式表示方法。
2、后缀表达式:
又称逆波兰式(Reverse Polish Notation - RPN),操作符以后缀形式位于两个运算数后(如:3+2的后缀表达形式就是3 2 +)。
3、前缀表达式:
又称波兰式(Polish Notation),操作符以前缀形式位于两个运算数前(如:3+2的前缀表达形式就是+ 3 2)。
中缀表达式往往需要使用括号将操作符和对应的操作数括起来,用于指示运算的次序
e.g:5*(2+1) 虽然 * 的优先级高于 + ,但括号的存在表示应优先执行括号内的 + 运算。
中缀表达式适合于人类的思维结构和运算习惯,但并不适用于计算机
尤其是包含括号的中缀表达式,对计算机而言是非常复杂的结构。
适用于计算机的后缀表达式
与中缀表达式不同,后缀表达式不需要使用括号来标识操作符的优先级。
后缀表达式的计算按 操作符从左到右出现的顺序依次执行(不考虑运算符之间的优先级),对于计算机而言是比较简单的结构。
二、中缀表达式转后缀表达式
从左至右依次遍历中缀表达式各个字符(需要准备一个字符栈存储操作符和括号)
1、字符为 运算数 :
直接送入后缀表达式(注:需要先分析出完整的运算数)。
2、字符为 左括号 :
直接入栈(注:左括号入栈后优先级降至最低)。
3、字符为 右括号 :
直接出栈,并将出栈字符依次送入后缀表达式,直到栈顶字符为左括号(左括号也要出栈,但不送入后缀表达式)。
总结:只要满足栈顶为左括号即可进行最后一次出栈。
4、字符为 操作符 :
若栈空,直接入栈。
若栈非空,判断栈顶操作符,若栈顶操作符优先级低于该操作符,该操作符入栈;否则一直出栈,并将出栈字符依次送入后缀表达式,直到栈空或栈顶操作符优先级低于该操作符,该操作符再入栈。
总结:只要满足栈空或者优先级高于栈顶操作符即可停止出栈,并将该操作符入栈。
5、重复以上步骤直至遍历完成中缀表达式,接着判断字符栈是否为空,非空则直接出栈,并将出栈字符依次送入后缀表达式。
注:中缀表达式遍历完成,栈中可能还有字符未输出,故需要判断栈空。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)