中缀后缀互相转换_76350543201611217525565
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 处理之后的表达式为
• e1 e2 e3 ...... en
后缀转中缀
• 1)从左向右扫描 • 2)当ei为运算符时,考察它左侧的两个变量ei-2和
ei-1:
• 如果ei-1.o的优先级小于ei.o,则ei-1的表达式左右加括号, 即ei-1.e = (ei-1.e)
• 对ei-2进行同样判断 • 将三者合并为新的Expr变量s,其中s
• s.e = ei-2.e ei.e ei-1.e • s.o = ei.o
• 3)最后一个变量扫描完毕之后,整个序列只剩下一 个Expr变量e,其e属性即为我们需要的中缀表示。
后缀转中缀 例1
• PQRT=∧∨
扫描位置坐标 0 1 2 3 4 3 2
输出:P∨Q∧(R=T)
公式 PQRT=∧∨ PQRT=∧∨ PQRT=∧∨ PQRT=∧∨ PQRT=∧∨ P Q R=T ∧ ∨ P Q∧(R=T) ∨ P∨Q∧(R=T)
•扫描到的元素
(
S1(栈底->栈顶) (
P
(
v
(v
(
(v(
Q
(v(
v
(v(v
R
(v(v
)
(v
)
空
v
v
(
v(
S
v(
v
v(v
T
v(v
)
v
达到最右端
空
输出: PQRvvSTvv
S2(队头->队尾) 空 P P P
说明 左括号直接入栈S1 命题符号,直接入队列 S1栈顶是左括号,直接入栈 左括号直接入栈S1
PQ PQ PQR PQRv
命题符号,直接入队列 S1栈顶是左括号,直接入栈 命题符号,直接入队列 右括号,弹出运算符直至遇到左括号
PQRvv
右括号,弹出运算符直至遇到左括号
PQRvv PQRvv PQRvvS PQRvvS PQRvvST PQRvvSTv PQRvvSTvv
S1为空,运算符直接入栈 左括号直接入栈S1 命题符号,直接入队列 S1栈顶是左括号,直接入栈 命题符号,直接入队列 右括号,弹出运算符直至遇到左括号 S1中剩余的运算符
后缀转中缀
将后缀表达式转换为前缀表达式,遵循以下步骤: • 定义类型Expr,Expr类型的变量表示一个表达式,
它有两个属性:
• Expr.e,表示表达式的字符串 • Expr.o,将表达式转化为后缀表达时,最右侧的运算
符
• 将输入的表达式每一个变量和运算符都转化为 Expr变量,e属性即为变量或者运算符的字符, 运算符的o属性就是它本身。
中缀转后缀
• (5) 遇到括号时: • (5-1) 如果是左括号“(”,则直接压入S1; • (5-2) 如果是右括号“)”,则依次弹出S1栈顶的运算符,
并压入S2,直到遇到左括号为止,此时将这一对括号丢 弃; • (6) 重复步骤(2)至(5),直到表达式的最右边; • (7) 将S1中剩余的运算符依次弹出并压入S2; • (8) 依次弹出S2中的元素并输出,结果的逆序即为中缀表 达式对应的后缀表达式(转换为前缀表达式时不用逆 序)。
后缀转中缀 例2
• PQR∨∨ST∨∨
扫描位置坐标 0 1 2 3 2 1 2 3 2
输出: (P∨(Q∨R))∨(S∨T)
公式 PQR∨∨ST∨∨ PQR∨∨ST∨∨ PQR∨∨ST∨∨ PQR∨∨ST∨∨ P Q∨R ∨ S T ∨ ∨ P∨(Q∨R) S T ∨ ∨ P∨(Q∨R) S T ∨ ∨ P∨(Q∨R) S T ∨ ∨ P∨(Q∨R) S∨T ∨ (P∨(Q∨R))∨(S∨T)
中缀后缀互相转换
符号说明
• 为了表示简便,程序中符号如下
• ┐,
非
• v,
或
• ∨,
与
• →,
推出
• =,
等价
中缀转后缀
将中缀表达式转换为后缀表达式 • (列1)S初2;始化两个栈:运算符栈S1和储存中间结果的队 • (2) 从左至右扫描中缀表达式; • (3) 遇到操作数时,将其压入S2; • (4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
中缀转后缀 例1
• PvQ∧(R=T)
输出:PQRT= ∧ v
扫描到的元素
P v Q ^ ( R "=" T )
到达最右端
S1(栈底->栈顶) S2(队头->队尾) 说明
空 v v v^ v^( v^( v^(“=” v^(“=” v^
P P PQ PQ PQ PQR PQR PQRT PQRT=
命题符号,直接入队列 S1为空,运算符直接入栈 命题符号,直接入队列 v优先级小于^,运算符直接入栈 左括号直接入栈S1 命题符号,直接入队列 S1栈顶是左括号,直接入栈 命题符号,直接入队列 右括号,弹出运算符直至遇到左括号
空
PQRT=^v S1中剩余的运算符
中缀转后缀பைடு நூலகம்例2
• (Pv(QvR))v(SvT)
• (此4-运1)算如符果入S1栈为;空,或栈顶运算符为左括号“(”,则直接将 • (4-2) 否则,若优先级比栈顶运算符的高,也将运算符压
入 而这S1 里则(注不意包转括换相为同前的缀情表况达)式;时是优先级较高或相同, • (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转
到(4-1)与S1中新的栈顶运算符相比较;