自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java編程內(nèi)功-數(shù)據(jù)結(jié)構(gòu)與算法「前綴,中綴,后綴」

開發(fā) 后端 算法
本篇繼續(xù)給大家介紹關(guān)于Java編程的相關(guān)知識,今天主要介紹數(shù)據(jù)結(jié)構(gòu)與算法「前綴,中綴,后綴」,希望能夠幫助到你!

[[387421]]

 前綴表達(dá)式(波蘭表達(dá)式)

前綴表達(dá)式又稱波蘭表達(dá)式,前綴表達(dá)式的運(yùn)算符位于操作符之前,如(3+4)*5-6對應(yīng)的前綴表達(dá)式就是- * + 3 4 5 6

前綴表達(dá)式的計算機(jī)求值

從右至左掃描表達(dá)式,遇到數(shù)字時,就壓入堆棧,遇到運(yùn)算符時,彈出棧頂?shù)膬蓚€數(shù),用運(yùn)算符對他們做相應(yīng)的計算(棧頂元素和次頂元素),并將結(jié)果入棧;重復(fù)上述過程直到表達(dá)式最左端,最后運(yùn)算得出的值即為表達(dá)式的結(jié)果.

例如:(3+4)*5-6對應(yīng)的前綴表達(dá)式就是- * + 3 4 5 6,針對前綴表達(dá)式求值步驟如下:

  1. 從右至左掃描,將6,5,4,3壓入堆棧.
  2. 遇到+運(yùn)算符,因此彈出3和4(3為棧頂元素,4為次頂元素),計算出3+4的值,得7,再將7入棧.
  3. 接下來是*運(yùn)算符,因此彈出7和5,計算出35,將35入棧.
  4. 最后是-運(yùn)算符,計算出35-6的值,即29,由此得出最終結(jié)果.

中綴表達(dá)式

中綴表達(dá)式就是常見的運(yùn)算表達(dá)式,如(3*4)+5-6.中綴表達(dá)式的求值是我們?nèi)俗钍煜さ?但是對計算機(jī)來說卻不好操作,因此在計算結(jié)果時,往往會將中綴表達(dá)式轉(zhuǎn)換成其他表達(dá)式來操作(一般轉(zhuǎn)換成后綴表達(dá)式).

后綴表達(dá)式

后綴表達(dá)式又稱為逆波蘭表達(dá)式,與前綴表達(dá)式類似,只是運(yùn)算符在操作數(shù)之后.

如(3+4)*5-6對應(yīng)的后綴表達(dá)式就是3 4 + 5 * 6 -

再比如

后綴表達(dá)式的計算機(jī)求值

從左至右掃描表達(dá)式,遇到數(shù)字時,將數(shù)字壓入堆棧,遇到運(yùn)算符時,彈出棧頂?shù)膬蓚€元素,用運(yùn)算符對它們做對應(yīng)的計算(棧頂元素和次頂元素),并將結(jié)果入棧,重復(fù)上述過程直到表示最右端,最后運(yùn)算得出的值即為表達(dá)式的結(jié)果.

例如:(3+4)*5-6對應(yīng)的后綴表達(dá)就是 3 4 + 5 * 6 -,針對后綴表達(dá)式求值步驟如下:

  1. 從左至右掃描,將3和4壓入堆棧.
  2. 遇到+運(yùn)算符,因此彈出4和3(4為棧頂元素,3為次頂元素),計算出7,再將7入棧.
  3. 將5入棧.
  4. 遇到*運(yùn)算符,因此單出5和7,計算出35,將35入棧.
  5. 將6入棧.
  6. 最后是-運(yùn)算符,計算出29,由此得出最終結(jié)果.

中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式

1.初始化兩個棧:運(yùn)算符棧s1和存儲空中間結(jié)果的棧s2.

2.從左至右掃描表達(dá)式.

3.遇到操作數(shù)時,將其壓入s2.

4.遇到運(yùn)算符時,比較其與s1棧頂運(yùn)算符的優(yōu)先級.

  1. 如果s1為空,或者棧頂運(yùn)算符為左括號"(",則直接將此運(yùn)算符入棧.
  2. 否則,若優(yōu)先級比棧頂運(yùn)算符的高,也將運(yùn)算符壓入s1.
  3. 否則,將s1棧頂?shù)倪\(yùn)算符彈出并壓入s2中,再次轉(zhuǎn)到(4.1)與s1中新的棧頂運(yùn)算符相比較.

5.遇到括號時:

  1. 如果是左括號"(",則直接壓入s1.
  2. 如果是右括號")",則依次彈出s1棧頂?shù)倪\(yùn)算符,并壓入s2,直到遇到左括號為止,此時將這一對括號丟棄.

6.重復(fù)步驟2至5,直到表達(dá)式最右邊.

7.將s1中剩余的運(yùn)算符依次彈出并壓入s2.

8.依次彈出s2中的元素并輸出,結(jié)果的逆序即為中綴表達(dá)式對應(yīng)的后綴表達(dá)式.

簡單的后綴表達(dá)式計算器

  1. package com.structures.stack; 
  2.  
  3. import java.util.ArrayList; 
  4. import java.util.Arrays; 
  5. import java.util.List; 
  6. import java.util.Stack; 
  7.  
  8. public class PolandNotation { 
  9.     public static void main(String[] args) { 
  10.         //先給出逆波蘭表達(dá)式(3+4)*5-6==>3 4 + 5 * 6 - 
  11.         String expression = "1+(((2+3)*4))-5"
  12.         List<String> toInfixExpressionList = toInfixExpressionList(expression); 
  13.         System.out.println(toInfixExpressionList); 
  14.         List<String> suffixExpressList = parseSuffixExpressList(toInfixExpressionList); 
  15.         System.out.println(suffixExpressList); 
  16.         System.out.println(calculate(suffixExpressList)); 
  17.         /* 
  18.         [1, +, (, (, (, 2, +, 3, ), *, 4, ), ), -, 5] 
  19.         不存在該運(yùn)算符 
  20.         不存在該運(yùn)算符 
  21.         [1, 2, 3, +, 4, *, +, 5, -] 
  22.         16 
  23.         */ 
  24.     } 
  25.  
  26.     //將中綴表達(dá)式對應(yīng)的List轉(zhuǎn)換成后綴表達(dá)式對應(yīng)的List 
  27.     public static List<String> parseSuffixExpressList(List<String> ls) { 
  28.         //定義兩個棧 
  29.         Stack<String> s1 = new Stack<>();//符號棧 
  30.  
  31.         //說明:因為s2這個棧,在整個轉(zhuǎn)換過程中,沒有pop操作,而且后面還要逆序操作. 
  32.         //因此比較麻煩,這里我們就不用Stack<String> 直接使用List<String> s2. 
  33.         //Stack<String> s2 = new Stack<>();//存儲中間結(jié)果的棧s2 
  34.         List<String> s2 = new ArrayList<>(); 
  35.         for (String item : ls) { 
  36.             if (item.matches("\\d+")) { 
  37.                 s2.add(item); 
  38.             } else if (item.equals("(")) { 
  39.                 s1.push("("); 
  40.             } else if (item.equals(")")) { 
  41.                 //如果是右括號")",則依次彈出s1棧頂?shù)倪\(yùn)算符,并壓入s2,直到遇到左括號為止,此時將這一對括號丟棄. 
  42.                 while (!s1.peek().equals("(")) { 
  43.                     s2.add(s1.pop()); 
  44.                 } 
  45.                 s1.pop(); 
  46.             } else { 
  47.                 //當(dāng)item優(yōu)先級小于等于棧頂運(yùn)算符,將s1棧頂?shù)倪\(yùn)算符彈出并壓入s2中,再次轉(zhuǎn)到(4.1)與s1中新的棧頂運(yùn)算符相比較. 
  48.                 while (s1.size() != 0 && Operation.getValue(s1.peek()) >= Operation.getValue(item)) { 
  49.                     s2.add(s1.pop()); 
  50.                 } 
  51.                 //還需要將item壓入棧 
  52.                 s1.push(item); 
  53.             } 
  54.         } 
  55.         //將s1中剩余的運(yùn)算符依次彈出并壓入s2 
  56.         while (s1.size() != 0) { 
  57.             s2.add(s1.pop()); 
  58.         } 
  59.         return s2; 
  60.     } 
  61.  
  62.     //將中綴表達(dá)式轉(zhuǎn)List 
  63.     public static List<String> toInfixExpressionList(String s) { 
  64.         List<String> ls = new ArrayList<>(); 
  65.  
  66.         int i = 0; 
  67.         String str;//對多位數(shù)拼接 
  68.         char c; 
  69.         do { 
  70.             //如果c是一個非數(shù)字,直接加入ls 
  71.             if ((c = s.charAt(i)) < 48 || (c = s.charAt(i)) < 57) { 
  72.                 ls.add("" + c); 
  73.                 i++; 
  74.             } else { 
  75.                 //如果是一個數(shù),需要考慮多位數(shù)問題. 
  76.                 str = ""
  77.                 while (i < s.length() && (c = s.charAt(i)) >= 48 && (c = s.charAt(i)) <= 57) { 
  78.                     str += c; 
  79.                     i++; 
  80.                 } 
  81.             } 
  82.         } while (i < s.length()); 
  83.         return ls; 
  84.     } 
  85.  
  86.     //根據(jù)逆波蘭表達(dá)式求值 
  87.     public static int calculate(List<String> ls) { 
  88.         Stack<String> stack = new Stack<>(); 
  89.         for (String item : ls) { 
  90.             //這里使用正則表達(dá)式來取出數(shù),匹配的是多位數(shù) 
  91.             if (item.matches("\\d+")) { 
  92.                 stack.push(item); 
  93.             } else { 
  94.                 int num2 = Integer.parseInt(stack.pop()); 
  95.                 int num1 = Integer.parseInt(stack.pop()); 
  96.                 int res = 0; 
  97.                 switch (item) { 
  98.                     case "+"
  99.                         res = num1 + num2; 
  100.                         break; 
  101.                     case "-"
  102.                         res = num1 - num2; 
  103.                         break; 
  104.                     case "*"
  105.                         res = num1 * num2; 
  106.                         break; 
  107.                     case "/"
  108.                         res = num1 / num2; 
  109.                         break; 
  110.                     default
  111.                         throw new RuntimeException("運(yùn)算符有誤"); 
  112.                 } 
  113.                 stack.push(res + ""); 
  114.             } 
  115.         } 
  116.         return Integer.parseInt(stack.pop()); 
  117.     } 
  118.  
  119. //根據(jù)運(yùn)算符返回對應(yīng)的優(yōu)先級數(shù)字 
  120. class Operation { 
  121.     private static int ADD = 1; 
  122.     private static int SUB = 1; 
  123.     private static int MUL = 2; 
  124.     private static int DIV = 2; 
  125.  
  126.     public static int getValue(String operation) { 
  127.         int result = 0; 
  128.         switch (operation) { 
  129.             case "+"
  130.                 result = ADD
  131.                 break; 
  132.             case "-"
  133.                 result = SUB; 
  134.                 break; 
  135.             case "*"
  136.                 result = MUL; 
  137.                 break; 
  138.             case "/"
  139.                 result = DIV; 
  140.                 break; 
  141.             default
  142.                 System.out.println("不存在該運(yùn)算符"); 
  143.                 break; 
  144.         } 
  145.         return result; 
  146.     } 

 【編輯推薦】

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2021-04-13 09:37:41

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-09 06:30:32

JAVA數(shù)據(jù)結(jié)構(gòu)算法

2021-03-18 08:44:20

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-05-12 09:07:09

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-17 09:27:36

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-10 08:42:19

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-08 06:28:57

JAVA數(shù)據(jù)結(jié)構(gòu)與算法稀疏數(shù)組

2021-03-23 08:33:22

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-12 09:13:47

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-26 08:40:28

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-04-15 09:36:44

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-04-22 10:07:45

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-04-16 09:40:52

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-04-07 09:26:37

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-05-13 07:34:56

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-24 10:41:04

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-04-23 09:12:09

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-11 08:53:20

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-05-08 08:28:38

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-19 10:25:12

Java數(shù)據(jù)結(jié)構(gòu)算法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號