摘要:支持括號(hào)小數(shù)負(fù)數(shù)也行運(yùn)算數(shù)字運(yùn)算符沒有括號(hào)正常運(yùn)算括號(hào)內(nèi)的值都取完了,刪除括號(hào)左右括號(hào)齊全先算括號(hào)內(nèi)的一個(gè)包含數(shù)字的列表和一個(gè)包含運(yùn)算符的列表形式可能會(huì)有空字符串符號(hào)列表同時(shí)出現(xiàn)從左至右運(yùn)算同時(shí)出現(xiàn)從左
public static void main(String[] args) { // 支持括號(hào) 小數(shù) 負(fù)數(shù) String statement = "-10/(4.5+5.5)*(-4-6+20)/-2"; // 10/(-2) 也行 System.out.println(calculate(statement)); } @SuppressWarnings("unchecked") private static double calculate(String statement){ Object[] result = filter(statement); // 運(yùn)算數(shù)字 List總結(jié)一下numList = (List) result[0]; // 運(yùn)算符 List symbolList = (List) result[1]; while (!symbolList.isEmpty()) { int index = symbolList.indexOf("("); if (index == -1) { // 沒有括號(hào)正常運(yùn)算 realCalculate(numList, symbolList); } else { int right = symbolList.indexOf(")"); if (right == index + 1) { // 括號(hào)內(nèi)的值都取完了,刪除括號(hào) symbolList.remove(index); symbolList.remove(index); continue; } // 左右括號(hào)齊全 先算括號(hào)內(nèi)的 if (right != -1) { List doubles = numList.subList(index, right); List subChars = symbolList.subList(index + 1, right); realCalculate(doubles, subChars); } } } return numList.get(0); } /** * @return 一個(gè)包含數(shù)字的列表和一個(gè)包含運(yùn)算符的列表 */ private static Object[] filter(String statement) { // 形式 123,456,789 可能會(huì)有空字符串 StringBuilder nums = new StringBuilder(); // 符號(hào)列表 List symbolList = new LinkedList<>(); for (int i = 0; i < statement.length(); i++) { char c = statement.charAt(i); if (c == "-" && (i == 0 || statement.charAt(i - 1) == "(" || statement.charAt(i - 1) == "*" || statement.charAt(i - 1) == "/")) { nums.append(c).append(statement.charAt(i + 1)); i++; } else if (Character.isDigit(c) || c == ".") { nums.append(c); } else { symbolList.add(c); nums.append(","); } } String[] ss = nums.toString().split(","); List numList = new ArrayList<>(); for (String num : ss) { if (!num.isEmpty()) { numList.add(Double.parseDouble(num)); } } return new Object[]{numList, symbolList}; } private static void realCalculate(List numList, List symbolList) { while (!symbolList.isEmpty()) { int index = symbolList.indexOf("*"), tmp; double value = 0.0D; if (index != -1 && (tmp = symbolList.indexOf("/")) != -1) { // 同時(shí)出現(xiàn) * / 從左至右運(yùn)算 if (index < tmp) { value = numList.remove(index) * numList.remove(index); } else { index = tmp; value = numList.remove(index) / numList.remove(index); } } else if (index != -1) { value = numList.remove(index) * numList.remove(index); } else if ((index = symbolList.indexOf("/")) != -1) { value = numList.remove(index) / numList.remove(index); } else if ((index = symbolList.indexOf("+")) != -1 && (tmp = symbolList.indexOf("-")) != -1) { // 同時(shí)出現(xiàn) + - 從左至右運(yùn)算 if (index < tmp) { value = numList.remove(index) + numList.remove(index); } else { index = tmp; value = numList.remove(index) - numList.remove(index); } } else if (index != -1) { value = numList.remove(index) + numList.remove(index); } else if ((index = symbolList.indexOf("-")) != -1) { value = numList.remove(index) - numList.remove(index); } // 刪除運(yùn)算符 symbolList.remove(index); // 將計(jì)算結(jié)果放回列表,待下次計(jì)算 numList.add(index, value); } }
我的方法是先從括號(hào)的算起,根據(jù)運(yùn)算符索引查找運(yùn)算數(shù)索引,從而進(jìn)行計(jì)算,算完后刪除運(yùn)算符和運(yùn)算數(shù),并將運(yùn)算結(jié)果放回待運(yùn)算的列表
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75051.html
摘要:多數(shù)運(yùn)算符都是由標(biāo)點(diǎn)符號(hào)表示,比如和。通常會(huì)根據(jù)需要對(duì)操作數(shù)進(jìn)行類型轉(zhuǎn)換左值是一個(gè)古老的屬于,它是指表達(dá)式只能出現(xiàn)在賦值運(yùn)算符的左側(cè)。也稱為嚴(yán)格相等運(yùn)算符,它用來檢測(cè)兩個(gè)操作數(shù)是否嚴(yán)格相等。運(yùn)算符的檢測(cè)規(guī)則是和運(yùn)算符的求反。 源代碼: https://github.com/RobinQu/Programing-In-Javascript/blob/master/chapters/...
摘要:跳過第二個(gè)運(yùn)算子的機(jī)制,被稱為短路有些程序員喜歡用它取代結(jié)構(gòu)等價(jià)于運(yùn)算符可以多個(gè)連用返回第一個(gè)布爾值為的表達(dá)式的值。 一、運(yùn)算符概述 1、定義 JavaScript中運(yùn)算符主要用于連接簡(jiǎn)單表達(dá)式,組成一個(gè)復(fù)雜的表達(dá)式 2、運(yùn)算符類別 算數(shù)運(yùn)算符 賦值表達(dá)式 比較表達(dá)式 布爾運(yùn)算符 位運(yùn)算符 二、算數(shù)運(yùn)算符 1、加法運(yùn)算符(Addition):x + y 加法運(yùn)算符是在運(yùn)行時(shí)決定,到...
摘要:原始表達(dá)式直接量保留字變量原始表達(dá)式表達(dá)式的最小單位表達(dá)式中的短語,解釋器會(huì)將其計(jì)算為一個(gè)結(jié)果對(duì)象和數(shù)據(jù)的初始化表達(dá)式對(duì)象直接量和數(shù)組直接量,它們和布爾直接量不同,它們不是原始表達(dá)式函數(shù)定義表達(dá)式函數(shù)直接量也不是原始表達(dá)式屬性訪問表達(dá)式語法 1 原始表達(dá)式 直接量、保留字、變量 原始表達(dá)式(primary expression):表達(dá)式的最小單位 表達(dá)式:JavaScript中的短語...
摘要:函數(shù)定義表達(dá)式。對(duì)象創(chuàng)建表達(dá)式。需要注意的是,大多數(shù)運(yùn)算符都是由標(biāo)點(diǎn)符號(hào)表示的,比如和。也就是說,空字符串將被當(dāng)作,布爾值將被當(dāng)作。對(duì)于和,則分別調(diào)用函數(shù)并取得字符串和。 表達(dá)式 表達(dá)式是由數(shù)字、運(yùn)算符、數(shù)字分組符號(hào)(如括號(hào))、自由變量和約束變量等以能求得數(shù)值的有意義排列方法所得的組合。JavaScript 表達(dá)式主要有以下幾種形式: 原始表達(dá)式:常量、變量、保留字。 對(duì)象、數(shù)組初始...
摘要:函數(shù)定義表達(dá)式。對(duì)象創(chuàng)建表達(dá)式。也就是說,空字符串將被當(dāng)作,布爾值將被當(dāng)作。如果有一個(gè)操作數(shù)是對(duì)象數(shù)值或布爾值,則調(diào)用它們的方法取得相應(yīng)的字符串值,然后再應(yīng)用前面關(guān)于字符串的規(guī)則。對(duì)于和,則分別調(diào)用函數(shù)并取得字符串和。 表達(dá)式 表達(dá)式是由數(shù)字、運(yùn)算符、數(shù)字分組符號(hào)(如括號(hào))、自由變量和約束變量等以能求得數(shù)值的有意義排列方法所得的組合。JavaScript 表達(dá)式主要有以下幾種形式: ...
摘要:用一行表示它們的關(guān)系就是運(yùn)算對(duì)象運(yùn)算符表達(dá)式語句運(yùn)算對(duì)象和運(yùn)算符構(gòu)成表達(dá)式,表達(dá)式構(gòu)成語句運(yùn)算對(duì)象運(yùn)算對(duì)象就是由各種對(duì)象構(gòu)成的集合,這些對(duì)象里面有些是常量,有些是變量。 編程的本質(zhì)就是數(shù)據(jù)和運(yùn)算,數(shù)據(jù)由基本數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)來表示,運(yùn)算就是對(duì)這些數(shù)據(jù)的各種操作,基本的加減乘除、是非判斷、流程控制等等。這些操作就是今天我們要講的運(yùn)算符、表達(dá)式和語句。 showImg(http://upl...
閱讀 3595·2021-09-13 10:28
閱讀 1946·2021-08-10 09:43
閱讀 1018·2019-08-30 15:44
閱讀 3189·2019-08-30 13:14
閱讀 1843·2019-08-29 16:56
閱讀 2946·2019-08-29 16:35
閱讀 2852·2019-08-29 12:58
閱讀 872·2019-08-26 13:46