數據結構與算法-前綴,后綴,中綴


 

Java數據結構和算法(六)——前綴、中綴、后綴表達式

 

 


  前面我們介紹了三種數據結構,第一種數組主要用作數據存儲,但是后面的兩種棧和隊列我們說主要作為程序功能實現的輔助工具,其中在介紹棧時我們知道棧可以用來做單詞逆序,匹配關鍵字符等等,那它還有別的什么功能嗎?以及數據結構與本篇博客的主題前綴、中綴、后綴表達式有什么關系呢?

1、人如何解析算術表達式

  如何解析算術表達式?或者換種說法,遇到某個算術表達式,我們是如何計算的:

  ①、求值 3+4-5

  

  這個表達式,我們在看到3+4后都不能直接計算3+4的值,知道看到4后面的 - 號,因為減號的優先級和前面的加號一樣,所以可以計算3+4的值了,如果4后面是 * 或者 /,那么就要在乘除過后才能做加法操作,比如:

  ②、求值 3+4*5

  

 

  這個不能先求3+4的值,因為4后面的*運算級別比前面的+高。通過這兩個表達式的說明,我們可以總結解析表達式的時候遵循的幾條規則:

  ①、從左到右讀取算式。

  ②、已經讀到了可以計算值的兩個操作數和一個操作符時,可以計算,並用計算結果代替那兩個操作數和一個操作符。

  ③、繼續這個過程,從左到右,能算就算,直到表達式的結尾。

 

2、計算機如何解析算術表達式

  對於前面的表達式 3+4-5,我們人是有思維能力的,能根據操作符的位置,以及操作符的優先級別能算出該表達式的結果。但是計算機怎么算?

  計算機必須要向前(從左到右)來讀取操作數和操作符,等到讀取足夠的信息來執行一個運算時,找到兩個操作數和一個操作符進行運算,有時候如果后面是更高級別的操作符或者括號時,就必須推遲運算,必須要解析到后面級別高的運算,然后回頭來執行前面的運算。我們發現這個過程是極其繁瑣的,而計算機是一個機器,只認識高低電平,想要完成一個簡單表達式的計算,我們可能要設計出很復雜的邏輯電路來控制計算過程,那更不用說很復雜的算術表達式,所以這樣來解析算術表達式是不合理的,那么我們應該采取什么辦法呢?

  請大家先看看什么是前綴表達式,中綴表達式,后綴表達式:這三種表達式其實就是算術表達式的三種寫法,以 3+4-5為例

  ①、前綴表達式:操作符在操作數的前面,比如 +-543

  ②、中綴表達式:操作符在操作數的中間,這也是人類最容易識別的算術表達式 3+4-5

  ③、后綴表達式:操作符在操作數的后面,比如 34+5-

  上面我們講的人是如何解析算術表達式的,也就是解析中綴表達式,這是人最容易識別的,但是計算機不容易識別,計算機容易識別的是前綴表達式和后綴表達式,將中綴表達式轉換為前綴表達式或者后綴表達式之后,計算機能很快計算出表達式的值,那么中綴表達式是如何轉換為前綴表達式和后綴表達式,以及計算機是如何解析前綴表達式和后綴表達式來得到結果的呢?

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、前綴表達式

  前綴表達式,指的是不包含括號,運算符放在兩個運算對象的前面,嚴格從右向左進行(不再考慮運算符的優先規則),所有的計算按運算符出現的順序。

  注意:后綴表達式是從左向右解析,而前綴表達式是從右向左解析。

  ①、如何將中綴表達式轉換為前綴表達式?

  

 

  ②、計算機如何實現前綴表達式的運算?

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM