数据结构与算法二:3)桟的应用--波兰表达式

254 阅读4分钟

这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

关注我,以下内容持续更新

数据结构与算法(一):时间复杂度和空间复杂度

数据结构与算法(二):桟

数据结构与算法(三):队列

数据结构与算法(四):单链表

数据结构与算法(五):双向链表

数据结构与算法(六):哈希表

数据结构与算法(七):树

数据结构与算法(八):排序算法

数据结构与算法(九):经典算法面试题

预览

中缀表达式前缀表达式后缀表达式
2*3/(2-1)+3*(4-1)+/*23-21*3-4123*21-/341-*+

上一篇我们介绍了桟的应用--逆波兰表达式 这篇主要介绍波兰表达式,波兰表达式也叫前缀表达式

中缀表达式对我们而言是很直观的(我们平时接触的就是这个),但计算机处理起来比较麻烦(括号、优先级之类的),前缀和后缀表达式中没有括号(因为中缀表达式转为前/后缀表达式后括号被舍弃,依旧保持正确的计算顺序),而且在计算中只需单向扫描(前缀表达式从右向左扫描,后缀表达式从左向右扫描),不需要考虑运算符的优先级。

前缀表达式

前缀表达式也叫波兰表达式,与后缀表达式相似,只是前缀表达式的运算符位于操作数之前

1. 前缀表达式求值

(1) 计算思路

① 计算规则

从右至左取数,直到取出一个运算符,将刚取出的紧挨着运算符的两个操作数按运算符进行计算,结果回填至运算符。重复该步骤,直到最后只剩下一个字符串则剩下的字符串即为结果。

前缀表达式的计算规则和后缀表达式相似,唯一不同的是扫描方向相反. 前序表达式是从右往左,后序表达式是从左往右.

② 计算过程

以前序表达式“+/*23-21*3-41”为例

  • 第一步:从右往左,先取出两个操作数“1”、“4”和一个运算符“-”,计算“4-1”,将结果3回填到字符串中,现在字符串变为“+/23-2133”。
  • 第二步:再从右至左取两个数“3”、“3”和“”,计算“33”,将结果“9”回填到字符串,得“+/*23-219”
  • 第三步:再取数,连续取出“9”、“1”、“2”,直到取出一个运算符“-”,将与运算符最近的两个操作数进行计算,即“2-1”得“1”,回填字符串中,现在为“+/*2319”
  • 第四步:重复上述步骤,取出“2*3”=6,回填字符串得到“+/619”
  • 第五步:再取“6/1”=6,得到“+69”
  • 第六步:再取“6+9”=15。运算完毕。
(2) 代码思路

① 计算规则

从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 和 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果

② 举例

例如: (3+4)x5-6对应的前缀表达式就是-x+3456,(至于前缀表达式怎么来的,后边会讲如何将中缀表达式转为前缀表达式)针对前缀表达式求值步骤如下:

  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. 中缀表达式转前缀

步骤

中缀表达式转前缀表达式步骤
1、反转输入字符串,如“2*3/(2-1)+3*(4-1)” 反转后为“ )1-4(*3+)1-2(/3*22、从字符串中取出下一个字符  
   2.1.如果是操作数,则直接输出  
   2.2.如果是“)”,压入栈中  
   2.3.如果是运算符但不是“(”,“)”,则不断循环进行以下处理
      2.3.1.如果栈为空,则此运算符进栈,结束此步骤    
      2.3.2.如果栈顶是“)”,则此运算符进栈,结束此步骤
      2.3.3.如果此运算符与栈顶优先级相同或者更高,此运算符进栈,结束此步骤    
      2.3.4.否则,运算符连续出栈,直到满足上述三个条件之一,然后此运算符进栈  
   2.4、如果是“(”,则运算符连续出栈,直到遇见“)”为止,将“)”出栈且丢弃之
3、如果还有更多的字符串,则转到第24、不在有未处理的字符串了,输出栈中剩余元素
5、再次反转字符串得到最终结果

关注我

如果觉得我写的不错,请点个赞 关注我 您的支持是我更文最大的动力!