数据结构与算法-前缀,后缀,中缀

 

Java数据结构和算法(六)——前缀、中缀、后缀表达式

 

 


  前面咱们介绍了三种数据结构,第一种数组主要用做数据存储,可是后面的两种栈和队列咱们说主要做为程序功能实现的辅助工具,其中在介绍栈时咱们知道栈能够用来作单词逆序,匹配关键字符等等,那它还有别的什么功能吗?以及数据结构与本篇博客的主题前缀、中缀、后缀表达式有什么关系呢?java

一、人如何解析算术表达式

  如何解析算术表达式?或者换种说法,遇到某个算术表达式,咱们是如何计算的:算法

  ①、求值 3+4-5数组

  

  这个表达式,咱们在看到3+4后都不能直接计算3+4的值,知道看到4后面的 - 号,由于减号的优先级和前面的加号同样,因此能够计算3+4的值了,若是4后面是 * 或者 /,那么就要在乘除事后才能作加法操做,好比:数据结构

  ②、求值 3+4*5数据结构和算法

  

 

  这个不能先求3+4的值,由于4后面的*运算级别比前面的+高。经过这两个表达式的说明,咱们能够总结解析表达式的时候遵循的几条规则:工具

  ①、从左到右读取算式。post

  ②、已经读到了能够计算值的两个操做数和一个操做符时,能够计算,并用计算结果代替那两个操做数和一个操做符。测试

  ③、继续这个过程,从左到右,能算就算,直到表达式的结尾。url

 

二、计算机如何解析算术表达式

  对于前面的表达式 3+4-5,咱们人是有思惟能力的,能根据操做符的位置,以及操做符的优先级别能算出该表达式的结果。可是计算机怎么算?

  计算机必需要向前(从左到右)来读取操做数和操做符,等到读取足够的信息来执行一个运算时,找到两个操做数和一个操做符进行运算,有时候若是后面是更高级别的操做符或者括号时,就必须推迟运算,必需要解析到后面级别高的运算,而后回头来执行前面的运算。咱们发现这个过程是极其繁琐的,而计算机是一个机器,只认识高低电平,想要完成一个简单表达式的计算,咱们可能要设计出很复杂的逻辑电路来控制计算过程,那更不用说很复杂的算术表达式,因此这样来解析算术表达式是不合理的,那么咱们应该采起什么办法呢?

  请你们先看看什么是前缀表达式,中缀表达式,后缀表达式:这三种表达式其实就是算术表达式的三种写法,以 3+4-5为例

  ①、前缀表达式:操做符在操做数的前面,好比 +-543

  ②、中缀表达式:操做符在操做数的中间,这也是人类最容易识别的算术表达式 3+4-5

  ③、后缀表达式:操做符在操做数的后面,好比 34+5-

  上面咱们讲的人是如何解析算术表达式的,也就是解析中缀表达式,这是人最容易识别的,可是计算机不容易识别,计算机容易识别的是前缀表达式和后缀表达式,将中缀表达式转换为前缀表达式或者后缀表达式以后,计算机能很快计算出表达式的值,那么中缀表达式是如何转换为前缀表达式和后缀表达式,以及计算机是如何解析前缀表达式和后缀表达式来获得结果的呢?

三、后缀表达式

  后缀表达式,指的是不包含括号,运算符放在两个运算对象的后面,全部的计算按运算符出现的顺序,严格从左向右进行(再也不考虑运算符的优先规则)。

  因为后缀表达式的运算符在两个操做数的后面,那么计算机在解析后缀表达式的时候,只须要从左向右扫描,也就是只须要向前扫描,而不用回头扫描,遇到运算符就将运算符放在前面两个操做符的中间(这里先不考虑乘方相似的单目运算),一直运算到最右边的运算符,那么就得出运算结果了。既而后缀表达式这么好,那么问题来了:

  ①、如何将中缀表达式转换为后缀表达式?

  对于这个问题,转换的规则以下:

  

  1、先自定义一个栈

  2、前缀表达式转换为后缀表达式

  3、测试

1
2
3
4
5
6
7
8
9
10
@Test
public  void  testInfixToSuffix(){
     String input;
     System.out.println( "Enter infix:" );
     Scanner scanner =  new  Scanner(System.in);
     input = scanner.nextLine();
     InfixToSuffix in =  new  InfixToSuffix(input);
     MyCharStack my = in.doTrans();
     my.displayStack();
}

  4、结果

  

   5、分析

  

 

  ②、计算机如何实现后缀表达式的运算?

  

  

四、前缀表达式

  前缀表达式,指的是不包含括号,运算符放在两个运算对象的前面,严格从右向左进行(再也不考虑运算符的优先规则),全部的计算按运算符出现的顺序。

  注意:后缀表达式是从左向右解析,而前缀表达式是从右向左解析。

  ①、如何将中缀表达式转换为前缀表达式?

  

 

  ②、计算机如何实现前缀表达式的运算?

  

相关文章
相关标签/搜索