心梦后花园

Back

基本思想#

人们习惯的运算方式是中缀表达式,而碰到前缀,后缀方式就变迷茫。其实仅仅是一种表达式的方式而已(不被你习惯的方式),我这里教你一种也许你老师都没跟你讲的简单转换方式。

一个中缀式到其他式子的转换方法:

这里我给出一个中缀表达式a+b*c-(d+e)

第一步:按照运算符的优先级对所有的运算单位加括号,式子变成:((a+(b*c))-(d+e))

第二步:转换前缀与后缀表达式

前缀:把运算符号移动到对应的括号前面

则变成:-( +(a *(bc)) +(de)),把括号去掉:-+a*bc+de 前缀式子出现

后缀:把运算符号移动到对应的括号后面

则变成拉:((a(bc)* )+ (de)+ )-,把括号去掉:abc*+de+- 后缀式子出现

发现没有,前缀式,后缀式是不需要用括号来进行优先级的确定的。

转自:https://zhuanlan.zhihu.com/p/47372892

程序实现原理:

  • 中缀转换前缀:

    (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; (2) 从右至左扫描中缀表达式; (3) 遇到操作数时,将其压入S2; (4) 遇到运算符时,比较其与S1栈顶运算符的优先级: (4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈; (4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1; (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较; (5) 遇到括号时: (5-1) 如果是右括号“)”,则直接压入S1; (5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃; (6) 重复步骤(2)至(5),直到表达式的最左边; (7) 将S1中剩余的运算符依次弹出并压入S2; (8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。

  • 中缀转换后缀:

    (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; (2) 从左至右扫描中缀表达式; (3) 遇到操作数时,将其压入S2; (4) 遇到运算符时,比较其与S1栈顶运算符的优先级: (4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈; (4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1; (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较; (5) 遇到括号时: (5-1) 如果是左括号“(”,则直接压入S1; (5-2) 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃; (6) 重复步骤(2)至(5),直到表达式的最左边; (7) 将S1中剩余的运算符依次弹出并压入S2; (8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。

C语言实现#

运行结果:

结果

参考:https://zhuanlan.zhihu.com/p/135433833

C语言实现中缀表达式转换前缀表达式和后缀表达式
https://www.liyp.cc/blog/c-infix-to-prefix-and-postfix-conversion
Author 万古一梦
Published at 2023年10月7日
Comment seems to stuck. Try to refresh?✨