เมื่อเร็ว ๆ นี้ฉันตรวจสอบอินเทอร์เน็ตเมื่อเร็ว ๆ นี้ แต่ฉันไม่พบรหัสสำหรับการดำเนินการทั้งสี่ที่เขียนโดย Java ดังนั้นฉันจึงลดลง
1. คำอธิบาย
รหัสได้รับการดำเนินการสี่อย่างง่าย ๆ รองรับ+,-,*,/, (, (, (,) สามารถคำนวณค่านิพจน์ที่ถูกต้องเท่านั้นและไม่มีการตรวจสอบการแสดงออกที่ผิดกฎหมาย
2. วิธีการใช้งาน
ขั้นตอนที่ 1: แปลงสตริงอินพุตเป็นรายการซึ่งส่วนใหญ่ใช้เพื่อแปลงสตริงเป็นอะตอม: ค่า/ตัวดำเนินการ/ตัวยึด
รายการสาธารณะทรานส์มาก (สตริง str) {รายการ strlist = new ArrayList ();/* รับสตริงสัญลักษณ์ของข้อมูล*/สตริง tmp = str.replaceall ("// d*", ""); คณะการคำนวณปัจจุบัน*/ String Curlet = null;/*บันทึกตำแหน่งของตัวดำเนินการแรกในอักขระ TMP*/ int loc = 0;/*strings สัญลักษณ์*/ int len = tmp.length (); i = 0; ) {strist.add (str.substring (0, loc) .trim ());} strlist.add (str.substring (loc, loc + 1); if (0 <str.length ()) {strlist.add (str.trim ());} return strlist;}
ขั้นตอนที่ 2: แปลงนิพจน์สีกลางต้นฉบับเป็นนิพจน์ต่อท้าย
สตริงสาธารณะ [] midtoend (รายการ midlist) {stack embl = new stack (); = (สตริง) it.next (); = embl.size () || "(" .equals (curstr)) {embl.push (curstr); * / if (")" (curstr) {ในขณะที่ (! "(" (". เท่ากับ ((สตริง) embl.peek ())) {ถ้า (0> = embl.size ()) {return null;} result.push (embl.pop ()));} embl.pop ();} else {int p1 = integer.parseint ((String) sign.get (curstr)); sign.get (embl.peek ())); else {ในขณะที่ (p1 <= p2 || embl.size ()> 0) {result.push (embl.pop ()); ((สตริง) sign.get (embl.peek ()));} embl.push (crstr);}}}} อื่น .push (embl.pop ());} int len = ผลลัพธ์. size (); [len -i -1] = (string) result.pop ();} return ret;}
ขั้นตอนที่ 3: ผลลัพธ์สุดท้ายของการวิเคราะห์การแสดงออกของคำต่อท้ายโดยส่งคืนการคำนวณการคำนวณ
/ *** แยกวิเคราะห์นิพจน์คำต่อท้ายและส่งคืนผลการดำเนินการที่สอดคล้องกัน* @param string [] endstr นิพจน์คำต่อท้ายที่แปลงแล้ว* @return Object ส่งคืนผลการดำเนินการหากนิพจน์ไม่ถูกต้องให้พิมพ์ "ข้อผิดพลาดอินพุต" โดยตรง*/ วัตถุสาธารณะคำนวณ (string [] endstr) {int len = endstr.length; endst r [i]) {ลอง {p2 = double.parsed ค่าเผื่อ (สตริง) callc.pop ()); (p1, p2, endstr [i])))); ; calc.size ()) {return calc.pop ();} else {return "ข้อผิดพลาดอินพุต";} /*** การใช้งานฟังก์ชันการทำงานพื้นฐาน* @param double p1 หมายเลข 1* @param double p1 หมายเลข 2* @param ตัวดำเนินการสตริง + -/ * */ สาธารณะ double simplecalc (double p1, double p2, ตัวดำเนินการสตริง) {swit ch (open.charat (0)) {case ' +': return p1 +p2; -p2;
ขั้นตอนที่ 4: ลำดับความสำคัญของตัวดำเนินการถูกวางไว้ในแคชสำหรับการสกัด
Private HashMap Sign = ใหม่ HashMap (); ); "0");}
กรอกรหัส
นำเข้า java.util.arraylist; นำเข้า java.util.hashmap นำเข้า java.util.itrator; และการหารและการดำเนินการของวงเล็บ * ตัวอย่างเช่น: 3+12+25 * (20-20/4) +10 * @author Guobo 2009-3-16 * @version 1.0 */คลาสสาธารณะ calculateExp {private static hashmap sign = ใหม่ h h ashmap ();/*ใส่ลำดับความสำคัญของตัวดำเนินการลงในการประมวลผลแคช*/การโทรสาธารณะ () {sign.put (")," 3 "); sign.put ("*"," 2 "); ใส่ (/"," 2 "); );} /*** @param string นิพจน์อินพุต* @return list องค์ประกอบสตริงที่แยกวิเคราะห์ ) +10 * ผลลัพธ์ของการแปลงคือ: * รายการรายการคือ ret = {3,+,+, 25, *, (, 20, 20, 20, //, 4, 4,),+, 10} * /รายการสาธารณะ transstr (string str) {list strlist = new ArrayList ();/* รับสตริงสัญลักษณ์ของข้อมูลที่เสนอ*/string tmp = str.replaceall ("// d*", ""); ตัวดำเนินการปัจจุบัน*/String Curlet = null;/*บันทึกตำแหน่งของตัวดำเนินการแรกในสตริง TMP*/int loc = 0;/*ความยาวสตริงสัญลักษณ์*/int len = tmp.length (); int i = 0; () "" , loc, loc, loc, loc, loc, loc, loc + 1); );} return strlist;}/*** จะแปลงนิพจน์จาก Infix Expressions เป็น Expressions คำต่อท้าย (โปแลนด์)* @param รายการรายการของการแสดงออกที่แยกวิเคราะห์* @return String [] สตริงนิพจน์ที่แปลงแล้ว*/สตริงสาธารณะ [] midtoend (รายการ midlist) {stack embl = stack new (); /if (sign.containskey (curstr)) {/* ถ้าสแต็กสัญลักษณ์ว่างเปล่าหรือสัญลักษณ์คือ (*/ถ้า (0 == embl.size () || "(". ". เท่ากับ (curstr)) { embl.push (curstr);} else {/*ถ้าสัญลักษณ์คือ) สแต็กสัญลักษณ์จะต้องออกจากสแต็กจนกระทั่งหนึ่ง (จนถึงตอนนี้*/ถ้า (")" เท่ากับ (curstr)) {ในขณะที่ (!! "(" (".Equals ((สตริง) embl.peek ())) {ถ้า (0> = embl.size ()) {return null;} result.push (embl.pop ()));} embl pop ();} else {int p1 = integer.parseint ((String) sign.get (curstr)); อักขระปัจจุบันลำดับความสำคัญของตัวอักษรปัจจุบันของลำดับความสำคัญกว่าสัญลักษณ์ด้านบนของสแต็ก*/if (p1> p2) {embl.push (curstr);} else {ในขณะที่ (p1 <= p2 || embl.size ()> 0) {result.push (embl .pop ()); .push (curstr); (); สตริง [] ret = สตริงใหม่ [len]; ret;}/*** นิพจน์การวิเคราะห์คำต่อท้าย, ส่งคืนผลการดำเนินการที่สอดคล้องกัน* @param string [] endstr นิพจน์คำต่อท้ายที่แปลงแล้ว* @return Object ส่งคืนผลการดำเนินการหากนิพจน์ไม่ถูกต้องให้พิมพ์ "ข้อผิดพลาดอินพุต"*/วัตถุสาธารณะ คำนวณ (String [] endstr) {int len = endstr.length; .ContainsKey (endstr [i])) {) {ลอง {p2 = double.parsed ค่าเผื่อ (สตริง) callc.pop ()); i]));} catch (numberFormatexception ex) {ex.printstacktrace (); [i]);}} ถ้า (1 == calc.size ()) {return calc.pop ();} else {return "ข้อผิดพลาดอินพุต";}/*** ตระหนักถึงฟังก์ชั่นการคำนวณพื้นฐาน* @param double p1 หมายเลข 1 * @param double p1 number 2 * @param String Operator +-/ * */public double simpleCalc (double p1, double p2, ตัวดำเนินการสตริง) {switch (oper.char at (0)) {{case ' +' : return p1 + p2; /วางโมฆะคงที่หลัก (สตริง [] args) {calculatexp ce = new calculatingexp (); ) CE.CALLICULE (CE.MIDTOEND (CE.TRANSSTR (TMP))); ค่าสองเท่า = 0; ;} system.out.print (ค่า);}}
ต่อไปนี้เป็นอาหารเสริมจากชาวเน็ตอื่น ๆ
แนวคิดของรหัสคือการคำนวณหน่วยการคำนวณขั้นต่ำแต่ละหน่วยผ่านการตัดสินปกติ ต่อไปนี้เป็นรหัส:
นำเข้า java.math.bigdecimal; นำเข้า java.util.regex.matcher; นำเข้า java.util.regex.pattern;/** * คลาสเครื่องมือเครื่องคิดเลข * @author shuqi * @date 2015-7-23 * @รุ่นตั้งแต่ 1.0 * /คลาสสาธารณะ calculatorutil {สาธารณะคงที่ bigdecimal arithmetic (String exp) {ถ้า (! exp.matic ("// d+") {string result = parseexp (exp) "," "); ส่งคืน bigdecimal ใหม่ (ผลลัพธ์);} else {ส่งคืน bigdecimal ใหม่ (exp);}/*** หน่วยการนับขั้นต่ำ ***/สตริงส่วนตัว =" ^^ ((// d+((// // d+(// d+//. // d+)) izing (//.//d+)???)|(/////-//////d+(/////d+))//ife)); ";/***การดำเนินการโดยไม่มีวงเล็บ*/สตริงคงที่ส่วนตัว notarentheses =" ^^ // (//)]+$ ";/*** การจับคู่การจับคู่หรือวิธีการแบ่ง*/สตริงส่วนตัว prient Predoperatorexp =" (// d+(//.// d+)? /d+)?) | (// [// d+(/////////) ) || -1 (////// d+ // d+ off ./d+)) THE ///////////////////ard)) ")") ")"; ** วิเคราะห์และคำนวณนิพจน์การดำเนินการทั้งสี่ตัวอย่างเช่น: 2+((3+4) * 2-22)/2 * 3 * @param นิพจน์ * @return */สตริงคงที่ส่วนตัว parseexp (นิพจน์สตริง) {// // วิธีการเข้าและแทนที่ช่องว่างก่อนและลบจำนวน () () ทั้งสองด้านของการทำงาน expression = expression.replaceall ("// s +", "") .replaceall ("^// (([^// (/)]+) //) $ "," $ 1 "); // การคำนวณนิพจน์ขั้นต่ำถ้า (expression.matches (minexp)) {string result = คำนวณ (นิพจน์); return double.parsedouble (ผลลัพธ์)> = 0? ผลลัพธ์: "["+ผลลัพธ์+"]"; ) ถ้า (mat.find ()) {สตริง tempminexp = mat.group (); . -matcher (นิพจน์); ถ้า mat.find ()) {String tempminexp = mat.group (); คำนวณการดำเนินการสี่แบบด้วยรูปแบบวงเล็บ = รูปแบบ compile (minparentheses); , parseexp (tempminexp));} return parseexp (นิพจน์); = exp.replaceall ("[// [/]" "," "); หมายเลขสตริง [] = exp.replacefirst (" (// d) [[// d) [["//+//-// // // // // /////] "," $ 1, "). แยก (", ","); operator = exp.replacefirst ("^^.*// d ([///////////////////////////////////////////////////// = number1.add (number2); (number2);} อื่นถ้า ("/". เท่ากับ (ตัวดำเนินการ)) {// พารามิเตอร์ที่สองคือความแม่นยำและที่สามคือผลลัพธ์ที่สี่สีห้าโหมด = number1 .divide (number2,5, bigdecimal round_ceiling);
เดิมทีรหัสเป็นบล็อก แต่รหัสไม่มีความคิดเห็นและมีข้อผิดพลาด จดบันทึกที่นี่เพื่อใช้งานง่ายในภายหลัง
นอกจากนี้เพื่อแสดงความเคารพต่อผู้เขียนต้นฉบับรหัสต้นฉบับจะแนบ
/** * Four operation expression calculation* @author penli * */public class Arithmetic { public static void main(String args[]){ System.out.println(arithmetic("2.2+( (3+4)*2 - 22)/2*3.2")); } public static double arithmetic(String exp){ String result = parseExp(exp).replaceAll("[//[//]]", ""); return Double.parseD ouble (ผลลัพธ์);}/** * การคำนวณเชิงวิเคราะห์ของการแสดงออกสี่แบบตัวอย่าง: 2+((3+4) * 2-22)/2 * 3 * @param นิพจน์ * @return */สตริงคงที่ parseexp (สตริง Expression) {// string numberreg = "^((?! 0) // d+(//.// d+(? <! 0))?) | (0 //.// d+(? <! 0) ) $ "; expression = expression.replaceall (" // s+"," ") .replaceall ("^// ((.+) //) $ "," $ 1 "); String checkexp =" // d " ; //-//////INK(((//D+(///.//D+))|(////-///D+(//.//d+)-//])) $ "; // การคำนวณนิพจน์ขั้นต่ำถ้า (expression.matches (minexp)) {string res) ult+"] ";} // คำนวณสี่การดำเนินการโดยไม่ต้องใช้วงเล็บ $ "; String PrioroperAtorexp =" (((// d+(//.////////+)?) | (//[//-// d+(//.///////////////if)? //]) [// *///] (// d+(//.//// d+)?) | /]) "; string operatorexp =" ((// d+(//.///////+)?) | (// [// [// -// d+(//./////////////////if)? //] )) [//+//-] (// d+(//./// D+)?) | (//-///d+(///// D+)? ///]) ")"; if (expression.matches (ไม่)) {pattern patt = pattern.compile (prehoperatexp); )} else {ompile (operatorexp); );} // คำนวณสี่ของการคำนวณสตริง minparentheses = "// ([^// (/)]+//)"; ถ้า (mat.find ()) {สตริง tempminexp = mat.group (); param exp * @return */สตริงคงที่สาธารณะคำนวณ (String exp) {exp = exp.replaceall ("[// [//]]", ""); ::::::::::::::::::::::: กระทาน ::::::::::::::::::::::: กระทาน :::::::::::::::::::::::::::::::::::::::::::: กระทานเรื่องที่::::/d) [//+//-//*////////2 "," $ 1, " ) การแยก (","); //////////////////////////////////////// ///////////// ตัวดำเนินการ)) {result = number1.subtract (number2);} ถ้า " *" = number1.divide (number2);
ในที่สุดฉันจะแบ่งปันวิธีการใช้งานของชาวเน็ตกับคุณ
นำเข้า Java.util.stack; IS: การใช้ตัวดำเนินการที่ได้รับในปัจจุบันกับพัดลมยอดนิยม Pristack: ถ้าสูงกว่าจะคำนวณก่อนและวางไว้ในสแต็ก ของการดำเนินการ; Each priority '('> ' *' = '/'> '+' = '-'> ')' * * */public class operate {Private Stack <cHaracter> Pristack = New Stack <); // The operating zoning stack Private Stack <Integer> Numstack = New Stack <Integer> (); // Operation number stack/*** Pass in the string that needs to be parsed, and return the calculation results (here is due to time problems, omitting legitimacy verification verification )* @Param Str needs to perform technical expression* @Return Calculation results*/ public into (String Str) {// 1. Determine whether there are illegal characters in String String Temp; // // 2. The loop starts to parse the string. When the string is parsed and the symbol stack is empty, the calculation is completed StringBuffer tempNum = new StringBuffer();// Used to temporarily store numeric strings (when it is multi-digit number ) StringBuffer string = new StringBuffer().append(str);// Used to save and improve efficiency while (string.length() != 0) { temp = string.substring(0, 1); string.delete(0 , 1); / / Judge temp. When temp is the operator if (!isNum(temp))) { // 1. At this time, the number that needs to be operated is the number, take out the number, press the stack, and clear the tempnum ถ้า (! "" ". เท่ากับ (tempnum.toString ())) {// เมื่อสัญลักษณ์แรกของนิพจน์คือตัวยึด int num = integer.parseint (tempnum.toString ()); ลบ (0, tempnum ความยาว ());} // ใช้ตัวดำเนินการที่ได้รับในปัจจุบันเพื่อจัดลำดับความสำคัญด้วยสัญลักษณ์การคำนวณสแต็ก: หากสูงกว่าจะถูกคำนวณก่อนวางไว้ที่ด้านบนของสแต็ก องค์ประกอบด้านบนของสแต็กนั้นอยู่นอกสแต็กและลบจำนวนการดำเนินงานของการดำเนินงาน; // กำหนดลำดับความสำคัญของสัญลักษณ์การคำนวณปัจจุบันและองค์ประกอบด้านบนของสแต็กนำองค์ประกอบออกมาและคำนวณ (เนื่องจากลำดับความสำคัญอาจน้อยกว่าองค์ประกอบด้านบนของสแต็กมันก็น้อยกว่าองค์ประกอบที่สอง ฯลฯ ., คุณต้องใช้การตัดสินรอบ) .pop (); = B + A; ผลลัพธ์); ผลการดำเนินงานในจำนวนการทำงานของ numstack อักขระ (temp.charat (0))); ถ้า (temp.charat (0) == ')') {// เมื่อด้านบนของสแต็กคือ '(' เมื่อองค์ประกอบปัจจุบันคือ ')' ในวงเล็บที่จะคำนวณและลบวงเล็บ propack.pop (); หลังจากได้รับจำนวนตัวเลขที่อ่านไปยังจำนวนการอ่าน (เมื่อไม่ใช่ตัวเลขเดียว)} ส่งคืน numstack.pop (); บูลีนส่วนตัว isnum (สตริงอุณหภูมิ) {return temp.matches ("[0-9]");} / ** * เปรียบเทียบสัญลักษณ์การทำงานปัจจุบันและสัญลักษณ์การทำงานขององค์ประกอบด้านบนของสแต็ก ของสแต็กส่งคืนจริงมิฉะนั้นจำเป็นต้องส่งคืน false * * * @param str ()) {// เมื่อว่างเปล่ามันเป็นสิ่งที่สำคัญที่สุด , ')' ไม่สามารถเป็นด้านบนของสแต็กได้ if (last == '(') {return true;} switch (str) {case '#': return false; // ตัวละครสิ้นสุด "; case ')': // ')') 'ลำดับความสำคัญต่ำสุด ส่งคืน false; ') กลับมาจริง; ew ทำงาน (); int t = ทำงานการควบคุม ("(3+4*(4*10-10/2)#"); system.out.println (t);}}