中缀:正常表达式

后缀:逆波兰式

         1、栈中存符合

         2、字母、数字直接打印

         3、先进栈,再比较优先级,只有当比栈中前一个符号优先级高的情况下才走下去,否则弹出前一个符号,直至前一个符号的优先级小于这个符号,也即是连续弹栈。

         4、打印的时候遇到括号不计在内,但是在栈中括号是被存储过的,当遇到)时,按照“先进后出”的原则弹出()里的全部符号

         5、最终,弹出栈中全部符号

前缀:波兰式

         (1) 首先构造一个运算符栈(也可放置括号),运算符(以括号为分界点)在栈内遵循越往栈顶优先级不降低的原则进行排列。

         (2)从右至左扫描中缀表达式,从右边第一个字符开始判断:

                  如果当前字符是数字,则分析到数字串的结尾并将数字串直接输出。

                  如果是运算符,则比较优先级。如果当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶是括号时,直接入栈), 则将运算符直接入栈;否则将栈顶运算符出栈并输出,直到当前运算符的优先级大于等于栈顶运算符的优先级(当栈顶是括号时,直接入栈),再将当前运算符入栈。

                  如果是括号,则根据括号的方向进行处理。如果是向右的括号,则直接入栈;否则,遇向左的括号前将所有的运算符全部出栈并输出,遇右括号后将向左、向右的两括号一起出栈(并不输出)。

         (3) 重复上述操作(2)直至扫描结束,将栈内剩余运算符全部出栈并输出,再逆缀输出字符串。中缀表达式也就转换为前缀表达式了。

例子:

                  a+b ---> +,a,b

                  a+(b-c) ---> +,a,-,b,c

                  a+(b-c)*d ---> +,a,*,-,b,c,d

                  a+1+3 ---> +,+,a,1,3

总结起来就是:后缀是从左往右,前缀是从右往左

常见考题形式:

2020-上大-913-数据结构-栈-中缀、后缀、前缀相互转换

1、前缀表达式转为中缀表达式即前缀表达式的计算机求值:
     从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈      顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。
     例如前缀表达式“- × + 3 4 5 6”:
     (1) 从右至左扫描,将6、5、4、3压入堆栈;
     (2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈;
     (3) 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈;
     (4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。

2、后缀表达式转为中缀表达式即后缀表达式的计算机求值:
 
   与前缀表达式类似,只是顺序是从左至右
     从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。
     例如后缀表达式“3 4 + 5 × 6 -”:
     (1) 从左至右扫描,将3和4压入堆栈;
     (2) 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈;
     (3) 将5入栈;
     (4) 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈;
     (5) 将6入栈;
     (6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。


 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-06-23
  • 2021-12-28
  • 2021-12-19
  • 2021-08-04
  • 2021-05-24
  • 2021-06-28
猜你喜欢
  • 2022-01-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案