成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[387421]]

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

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

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

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

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

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

中綴表達(dá)式

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

后綴表達(dá)式

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

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

再比如

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

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

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

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

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

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

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

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

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

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

5.遇到括號(hào)時(shí):

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

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

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

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

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

  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á)式對(duì)應(yīng)的List轉(zhuǎn)換成后綴表達(dá)式對(duì)應(yīng)的List 
  27.     public static List<String> parseSuffixExpressList(List<String> ls) { 
  28.         //定義兩個(gè)棧 
  29.         Stack<String> s1 = new Stack<>();//符號(hào)棧 
  30.  
  31.         //說明:因?yàn)閟2這個(gè)棧,在整個(gè)轉(zhuǎn)換過程中,沒有pop操作,而且后面還要逆序操作. 
  32.         //因此比較麻煩,這里我們就不用Stack<String> 直接使用List<String> s2. 
  33.         //Stack<String> s2 = new Stack<>();//存儲(chǔ)中間結(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.                 //如果是右括號(hào)")",則依次彈出s1棧頂?shù)倪\(yùn)算符,并壓入s2,直到遇到左括號(hào)為止,此時(shí)將這一對(duì)括號(hào)丟棄. 
  42.                 while (!s1.peek().equals("(")) { 
  43.                     s2.add(s1.pop()); 
  44.                 } 
  45.                 s1.pop(); 
  46.             } else { 
  47.                 //當(dāng)item優(yōu)先級(jí)小于等于棧頂運(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;//對(duì)多位數(shù)拼接 
  68.         char c; 
  69.         do { 
  70.             //如果c是一個(gè)非數(shù)字,直接加入ls 
  71.             if ((c = s.charAt(i)) < 48 || (c = s.charAt(i)) < 57) { 
  72.                 ls.add("" + c); 
  73.                 i++; 
  74.             } else { 
  75.                 //如果是一個(gè)數(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)算符返回對(duì)應(yīng)的優(yōu)先級(jí)數(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-03-09 06:30:32

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

2021-03-18 08:44:20

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

2021-04-13 09:37:41

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

2021-05-12 09:07:09

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

2021-03-08 06:28:57

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

2021-03-10 08:42:19

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

2021-03-17 09:27:36

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

2021-03-12 09:13:47

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

2021-03-23 08:33:22

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-07 09:26:37

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

2021-04-16 09:40:52

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ù)棧公眾號(hào)

主站蜘蛛池模板: 孰女乱色一区二区三区 | 久久久国产一区二区三区 | 国产91丝袜在线18 | 亚洲免费在线观看 | 亚洲午夜网 | 欧美一区二区三区高清视频 | 美女视频黄色片 | 久在线 | 久久精品欧美电影 | 精品在线播放 | 欧美成人免费在线 | 成人在线小视频 | 国产美女在线精品免费 | 精品国产一区二区三区久久 | 日韩二区 | 国产欧美精品一区二区色综合 | 亚洲免费在线观看 | 久久av综合 | 欧美一区二区三区 | 国产亚洲精品久久午夜玫瑰园 | 中文字幕欧美日韩一区 | 成人一区二区三区在线观看 | 先锋资源网站 | 国产在线视频在线观看 | 亚洲区在线 | 久久亚洲一区二区三区四区 | 亚洲第一中文字幕 | 国内精品久久久久 | 国产成人精品亚洲日本在线观看 | 日本精品视频一区二区三区四区 | 成年视频在线观看 | 91精品国产777在线观看 | 一级看片免费视频 | 国精产品一区一区三区免费完 | 亚洲精品一区中文字幕乱码 | 亚洲欧美在线一区 | 亚洲视频二区 | 岛国精品 | av一区二区在线观看 | 中文字幕一区二区在线观看 | 久久免费精品 |