欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Java的數(shù)據(jù)結(jié)構(gòu)與算法有哪些

本篇內(nèi)容主要講解“Java的數(shù)據(jù)結(jié)構(gòu)與算法有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java的數(shù)據(jù)結(jié)構(gòu)與算法有哪些”吧!

十載專業(yè)網(wǎng)站制作公司歷程,堅(jiān)持以創(chuàng)新為先導(dǎo)的網(wǎng)站服務(wù),服務(wù)超過上千企業(yè)及個(gè)人,涉及網(wǎng)站設(shè)計(jì)、手機(jī)APP定制開發(fā)、微信開發(fā)、平面設(shè)計(jì)、互聯(lián)網(wǎng)整合營(yíng)銷等多個(gè)領(lǐng)域。在不同行業(yè)和領(lǐng)域給人們的工作和生活帶來美好變化。

 前綴表達(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. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 從右至左掃描,將6,5,4,3壓入堆棧.

  3. 遇到+運(yùn)算符,因此彈出3和4(3為棧頂元素,4為次頂元素),計(jì)算出3+4的值,得7,再將7入棧.

  4. 接下來是*運(yùn)算符,因此彈出7和5,計(jì)算出35,將35入棧.

  5. 最后是-運(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 -

再比如

Java的數(shù)據(jù)結(jié)構(gòu)與算法有哪些

后綴表達(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. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 從左至右掃描,將3和4壓入堆棧.

  3. 遇到+運(yùn)算符,因此彈出4和3(4為棧頂元素,3為次頂元素),計(jì)算出7,再將7入棧.

  4. 將5入棧.

  5. 遇到*運(yùn)算符,因此單出5和7,計(jì)算出35,將35入棧.

  6. 將6入棧.

  7. 最后是-運(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. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 如果s1為空,或者棧頂運(yùn)算符為左括號(hào)"(",則直接將此運(yùn)算符入棧.

  3. 否則,若優(yōu)先級(jí)比棧頂運(yùn)算符的高,也將運(yùn)算符壓入s1.

  4. 否則,將s1棧頂?shù)倪\(yùn)算符彈出并壓入s2中,再次轉(zhuǎn)到(4.1)與s1中新的棧頂運(yùn)算符相比較.

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

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 如果是左括號(hào)"(",則直接壓入s1.

  3. 如果是右括號(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á)式.

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

package com.structures.stack;  import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Stack;  public class PolandNotation {     public static void main(String[] args) {         //先給出逆波蘭表達(dá)式(3+4)*5-6==>3 4 + 5 * 6 -         String expression = "1+(((2+3)*4))-5";         List<String> toInfixExpressionList = toInfixExpressionList(expression);         System.out.println(toInfixExpressionList);         List<String> suffixExpressList = parseSuffixExpressList(toInfixExpressionList);         System.out.println(suffixExpressList);         System.out.println(calculate(suffixExpressList));         /*         [1, +, (, (, (, 2, +, 3, ), *, 4, ), ), -, 5]         不存在該運(yùn)算符         不存在該運(yùn)算符         [1, 2, 3, +, 4, *, +, 5, -]         16         */     }      //將中綴表達(dá)式對(duì)應(yīng)的List轉(zhuǎn)換成后綴表達(dá)式對(duì)應(yīng)的List     public static List<String> parseSuffixExpressList(List<String> ls) {         //定義兩個(gè)棧         Stack<String> s1 = new Stack<>();//符號(hào)棧          //說明:因?yàn)閟2這個(gè)棧,在整個(gè)轉(zhuǎn)換過程中,沒有pop操作,而且后面還要逆序操作.         //因此比較麻煩,這里我們就不用Stack<String> 直接使用List<String> s2.         //Stack<String> s2 = new Stack<>();//存儲(chǔ)中間結(jié)果的棧s2         List<String> s2 = new ArrayList<>();         for (String item : ls) {             if (item.matches("\\d+")) {                 s2.add(item);             } else if (item.equals("(")) {                 s1.push("(");             } else if (item.equals(")")) {                 //如果是右括號(hào)")",則依次彈出s1棧頂?shù)倪\(yùn)算符,并壓入s2,直到遇到左括號(hào)為止,此時(shí)將這一對(duì)括號(hào)丟棄.                 while (!s1.peek().equals("(")) {                     s2.add(s1.pop());                 }                 s1.pop();             } else {                 //當(dāng)item優(yōu)先級(jí)小于等于棧頂運(yùn)算符,將s1棧頂?shù)倪\(yùn)算符彈出并壓入s2中,再次轉(zhuǎn)到(4.1)與s1中新的棧頂運(yùn)算符相比較.                 while (s1.size() != 0 && Operation.getValue(s1.peek()) >= Operation.getValue(item)) {                     s2.add(s1.pop());                 }                 //還需要將item壓入棧                 s1.push(item);             }         }         //將s1中剩余的運(yùn)算符依次彈出并壓入s2         while (s1.size() != 0) {             s2.add(s1.pop());         }         return s2;     }      //將中綴表達(dá)式轉(zhuǎn)List     public static List<String> toInfixExpressionList(String s) {         List<String> ls = new ArrayList<>();          int i = 0;         String str;//對(duì)多位數(shù)拼接         char c;         do {             //如果c是一個(gè)非數(shù)字,直接加入ls             if ((c = s.charAt(i)) < 48 || (c = s.charAt(i)) < 57) {                 ls.add("" + c);                 i++;             } else {                 //如果是一個(gè)數(shù),需要考慮多位數(shù)問題.                 str = "";                 while (i < s.length() && (c = s.charAt(i)) >= 48 && (c = s.charAt(i)) <= 57) {                     str += c;                     i++;                 }             }         } while (i < s.length());         return ls;     }      //根據(jù)逆波蘭表達(dá)式求值     public static int calculate(List<String> ls) {         Stack<String> stack = new Stack<>();         for (String item : ls) {             //這里使用正則表達(dá)式來取出數(shù),匹配的是多位數(shù)             if (item.matches("\\d+")) {                 stack.push(item);             } else {                 int num2 = Integer.parseInt(stack.pop());                 int num1 = Integer.parseInt(stack.pop());                 int res = 0;                 switch (item) {                     case "+":                         res = num1 + num2;                         break;                     case "-":                         res = num1 - num2;                         break;                     case "*":                         res = num1 * num2;                         break;                     case "/":                         res = num1 / num2;                         break;                     default:                         throw new RuntimeException("運(yùn)算符有誤");                 }                 stack.push(res + "");             }         }         return Integer.parseInt(stack.pop());     } }  //根據(jù)運(yùn)算符返回對(duì)應(yīng)的優(yōu)先級(jí)數(shù)字 class Operation {     private static int ADD = 1;     private static int SUB = 1;     private static int MUL = 2;     private static int DIV = 2;      public static int getValue(String operation) {         int result = 0;         switch (operation) {             case "+":                 result = ADD;                 break;             case "-":                 result = SUB;                 break;             case "*":                 result = MUL;                 break;             case "/":                 result = DIV;                 break;             default:                 System.out.println("不存在該運(yùn)算符");                 break;         }         return result;     } }

到此,相信大家對(duì)“Java的數(shù)據(jù)結(jié)構(gòu)與算法有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

當(dāng)前標(biāo)題:Java的數(shù)據(jù)結(jié)構(gòu)與算法有哪些
本文網(wǎng)址:http://chinadenli.net/article46/gsgheg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃定制網(wǎng)站網(wǎng)站改版品牌網(wǎng)站設(shè)計(jì)外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)