Baru -baru ini, saya memeriksa internet baru -baru ini, tetapi saya tidak menemukan kode untuk empat operasi yang ditulis oleh Java, jadi saya menurunkannya.
1. Penjelasan
Kode hanya mencapai empat operasi sederhana, mendukung+,-,*,/, (, (,) hanya dapat menghitung nilai ekspresi yang benar, dan tidak ada verifikasi ekspresi ilegal.
2. Metode Implementasi
Langkah 1: Konversi string input ke daftar, yang terutama digunakan untuk mengonversi string menjadi atom: nilai/operator/braket
Daftar Publik Trans Much (String str) {List strlist = new arraylist ();/* Dapatkan string simbol dari data*/string tmp = str.replaceall ("// d*", "");/* Rekam yang Fakultas perhitungan saat ini*/ string curlet = null;/*Catat posisi operator pertama dalam karakter TMP*/ int loc = 0;/*string simbol*/ int len = tmp.length (); untuk (int 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;}
Langkah 2: Konversi ekspresi warna medium asli ke ekspresi akhiran.
Public String [] MidtoEnd (Daftar MidList) {Stack EMBL = Stack baru (); = (String) it.next (); / * Konfirmasikan apakah string formal * / if (Sign.containskey (Curstr))) { / * Jika tumpukan simbol kosong atau simbolnya ( * / if (0 = = EMBL.Size () || "(" .Equals (Curstr)) {embl.push (Curstr);} else { /*Jika simbolnya) tumpukan simbol harus keluar dari tumpukan sampai satu (sejauh ini * / if (")". result.push (embl.pop ()));} embl.pop ();} else {int p1 = integer.parseint ((string) Sign.get (Curstr)); Sign.get (EMBL.Peek ())); /* Jika prioritas karakter saat ini lebih besar dari prioritas simbol teratas tumpukan* / if (p1> p2) {embl.push (Curstr);} Else {while (p1 <= p2 || embl.size ()> 0) {result.push (embl.pop ()); ((String) Sign.get (embl.peek ()));} embl.push (crstr);}}}} else {hasil. .push (embl.pop ());} int len = .Size (); [Len -i -1] = (string) result.pop ();} return ret;}
Langkah 3: Hasil akhir dari analisis ekspresi akhiran, mengembalikan perhitungan perhitungan
/ *** Parses ekspresi akhiran dan mengembalikan hasil operasi yang sesuai* @param string [] endStr ekspresi akhiran yang dikonversi* @return objek mengembalikan hasil operasi jika ekspresi salah, cetak "kesalahan input" secara langsung*/ objek publik menghitung (String [] endstr) {int len = endstr.length; endst r [i]) {coba {p2 = ganda. ); Calc.size ()) {return calc.pop ();} else {return "input error";} /*** Implementasi Fungsi operasi yang mendasarinya* @param ganda P1 nomor 1* @param Double P1 Nomor 2* @param Operator String + -/ * */ Public Double Simplecalc (Double P1, Double P2, String Operator) {Swit Ch (open.charat (0)) {case ' +': return p1 +p2; -p2;
Langkah 4: Prioritas operator ditempatkan di cache untuk ekstraksi
tanda hashmap statis = hashmap baru (); ); "0");}
Kode lengkap
Impor Java.util.arraylist; dan operasi divisi dan braket * misalnya: 3+12+25 * (20-20/4) +10 * @author guobo 2009-3-16 * @Version 1.0 */kelas publik CalculateExp {private static hashmap Sign = baru h ashmap ();/*Masukkan prioritas operator ke dalam pemrosesan cache*/panggilan publik () {Sign.put (")," 3 "); Sign.put ("*"," 2 "); tanda. put (/"," 2 "); );. ) +10 * Hasil konversi adalah: * Elemen daftar adalah ret = {3,+,+, 25, *, (, 20, 20, 20, //, 4, 4,),+, 10} * /daftar publik transstr (string str) {list strlist = new arraylist ();/* Dapatkan string simbol dari data yang diusulkan*/string tmp = str.replaceall ("// d*", "");/* Record Operator saat ini*/string curlet = null;/*Catat posisi operator pertama dalam string TMP*/int loc = 0;/*Panjang string simbol*/int len = tmp.length (); int i = 0; () "". , Loc, loc, loc, loc, loc, loc, loc + 1); );} Return strlist;}/*** akan mengonversi ekspresi dari ekspresi infix ke ekspresi sufiks (poles)* @param daftar daftar ekspresi parsed* @return string [] dikonversi string array*/public string [] midtoEnd (daftar midlist) {stack embl = stack baru (); /if (Sign.containsKey (Curstr)) {/* Jika tumpukan simbol kosong atau simbolnya adalah (*/if (0 == embl.size () || "(". ". Equals (Curstr)) { Embl.push (Curstr);} else {/*Jika simbolnya) Tumpukan simbol harus keluar dari tumpukan sampai satu (sejauh ini*/if (")". Equals (Curstr)) {while (!! "(" (".equals ((string) embl.peek ())) {if (0> = embl.size ()) {return null;} result.push (embl.pop ()));} embl. pop ();} else {int p1 = integer.parseInt ((string) Sign.get (Curstr)); Karakter saat ini prioritas prioritas prioritas daripada simbol atas tumpukan*/if (p1> p2) {embl.push (curstr);} else {while (p1 <= p2 || embl.size ()> 0) {Result.push (embl .pop ()); .push (Curstr);}}} else {result.push (Curstr);} while (0 <embl.size ()) {result.push (embl.pop ());} int len = result.size (); Ret;}/*** analisis ekspresi sufiks, kembalikan hasil operasi yang sesuai* @param string [] endStr ekspresi akhiran yang dikonversi* @return objek mengembalikan hasil operasi jika ekspresi salah, cetak "kesalahan input"*/objek publik Hitung (string [] endstr) {int len = endstr.length; .containsKey (endstr [i]))) {) {coba {p2 = double.parsed tunjangan (string) callc.pop ()); i]);} catch (NumberFormateSception ex) {ex.printstacktrace () [i]);}} if (1 == calc.size ()) {return calc.pop ();} else {return "input error";}/*** Sadari fungsi komputasi yang mendasarinya* @param double p1 Nomor 1 * @param Double P1 Number 2 * @param String Operator +-/ * */Public Double SimpleCalc (Double P1, Double P2, String Operator) {switch (oper.char at (0)) {{case ' +' : Return p1 + p2; /Tempatkan statis void main (string [] args) {calculatexp ce = new calculatingExp (); ) Ce.Calculate (Ce.MidToEnd (Ce.Transstr (TMP)); nilai ganda = 0 ;} System.out.print (value);}}
Berikut ini adalah suplemen dari netizen lain
Gagasan kode adalah untuk menghitung setiap unit perhitungan minimum melalui penilaian reguler. Berikut ini adalah kodenya:
Impor java.math.bigdecimal; import java.util.regex.matcher; import java.util.regex.pattern;/** * Kelas alat kalkulator * @author shuqi * @date 2015-7-23 * Versi sejak 1.0 * /Public Class Calculatorutil {public static BigDecimal aritmetic (string exp) {if (! Exp.Matic ("// d+") {string result = parseExp (exp) .re placeall ("[// [//]" "" "," "); Kembalikan BigDecimal baru (hasil);} else {return new BigDecimal (exp);}/*** Unit penghitungan minimum ***/private string =" ^^ ((// d+((// d+(// d+//. // d+)) izing (//.//d+)?)|(// 5////d+(/////d+)?// media)))$ ";/***Operasi tanpa tanda kurung*/string statis privat notarentheses =" ^^ // (//)]+$ ";/*** pencocokan multiplikasi atau metode divisi*/string privat prioroperatorExp =" (// d+(//.// d+)? /d+)?) |. ) || -1 (///// d+ // d+ off .//d+))|-1 (////-/d+ (// // d+)? ////////// /////////////// dmi)) ")") ")"; ** Analisis dan Hitung Empat Ekspresi Operasi, misalnya: 2+((3+4) * 2-22)/2 * 3 * @param Expression * @return */Private Static String ParseExp (String Expression) {// Metode ini masuk dan menggantikan ruang terlebih dahulu, dan menghapus angka () di kedua sisi operasi ekspresi = ekspresi.replaceall ("// s +", "") .replaceall ("^// (([^/// (/)]+) //) $ "," $ 1 "); // Perhitungan Ekspresi Minimum Jika (Expression.matches (MINEXP)) {String hasil = Hitung (ekspresi); return double.parsedouble (hasil)> = 0? Hasil: "+Hasil+"] "; ); .Matcher (Ekspresi); Hitung empat operasi dengan pola braket = pola.compile (minparentheses); , parseexp (tempminexp));} return parseexp (ekspresi); = Exp.replaceall ("[// [/]" "," "); Nomor string [] = exp.replacefirst (" (// d) [[// d) [["//+//-// /*///] "," $ 1, "). Split (", ","); Operator = exp.replacefirst ("^^.*// d ([////////////// Bus", "$ 1"), +". Equals (operator)) {hasilnya = number1.add (number2);} lain jika ("-". (number2);} lain jika ("/". Equals (operator)) {// Parameter kedua adalah presisi, dan yang ketiga adalah hasil mode lima-entri empat warna = number1 .divide (angka2,5, BigDecimal. Round_ceiling);} Hasil pengembalian! = NULL?
Kode awalnya sebuah blog, tetapi kode tidak memiliki komentar dan ada bug. Catat di sini untuk mudah digunakan nanti
Selain itu, untuk mengungkapkan rasa hormat kepada penulis asli, kode asli dilampirkan
/*** Empat Perhitungan Ekspresi Operasi* @Author Penli**/Kelas Publik Arithmetic {public static void main (String args []) {System.out.println (aritmetic ("2.2+ ((3+4)* 2 - 22) /2*3.2 "));} aritmatika ganda statis public (string exp) {string result = parseExp (exp) .replaceall (" [// [//] "," "); return double.parsed ouble (Hasil);}/** * Perhitungan analitik dari empat ekspresi operasi, Contoh: 2+((3+4) * 2-22)/2 * 3 * @param Expression * @return */string statis publik Parseexp (string ekspresi) {// string numberReg = "^((?! 0) // d+(//.// d+(? <! 0))?) | (0 //// d+(? <! 0) ) $ "; ekspresi = ekspresi.replaceall (" // s+"," ") .replaceall ("^// ((.+) //) $ "," $ 1 "); string checkexp =" // d " ; /////*// media((//d+(//.//d+)?)|(//anjang/////d+(/////d+)?//])))))))))))))))))))))))))))) $ "; // Perhitungan ekspresi minimum jika (ekspresi.matches (MINEXP)) {string res) ult+"] ";} // Hitung empat operasi tanpa kurung string noparentheses ="^[^// (//)]+ $ "; String prioroperatorExp =" (((// d+(//.// d+)?) | (//[//-// d+(///// d+)? //]) [// *///] (// d+(//.// d+)?) | /]) "; string operatorExp =" ((// d+(//./// d+)?) | (// [// [// -// d+(//.// d+)? //] )) [//+//-] (// d+(//.// d+)?) | if (expression.matches (not)) {pola patt = pola.compile (priorOperatexp); )} Else {ompile (operatorExp); );} // Hitung empat string komputasi kurung minparentheses = "// ([^// (/)]+//)"; ; Param exp * @return */Public Static String CHOCTULASI (string exp) {exp = exp.replaceall ("[// [//]", ""); ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::/D) [//+//-//*///] "," $ 1, " ). ///////// bin $ "," $ 1 "); if ("+". Equals (operator)) {result = number1.add (number2);} lain jika ("-". Equals ( Operator)) {result = number1.subtract (number2);} lain jika " *". = Number1.divide (Number2);
Akhirnya, saya akan berbagi dengan Anda metode implementasi netizen.
Impor Java.util.Stack; IS: Menggunakan operator yang saat ini diperoleh dengan Fans Top Stack Pristack: jika lebih tinggi, itu akan dihitung terlebih dahulu dan meletakkannya di bagian atas tumpukan; Operasi; * Jika kurang, hal yang sama benar. Setiap prioritas '('> ' *' = '/'> '+' = '-'> ')' * */kelas publik beroperasi {private stack <chorate> pristack = new stack <); Stack Private Stack <Integer> numStack = Stack baru <Integer> (); verifikasi verifikasi)* @param STR perlu melakukan ekspresi teknis* @Return Hasil perhitungan*/ public in (string str) {// 1. Tentukan apakah ada karakter ilegal dalam string string temp; Untuk mengurai string. StringBuffer (). Append (str); // Digunakan untuk menyimpan dan meningkatkan efisiensi sementara (String.length ()! = 0) {Temp = String.substring (0, 1); / Hakim Temp. tempnum if (! "" ". sama (tempnum.tostring ())) {// Ketika simbol pertama dari ekspresi adalah braket int num = integer.parseint (tempnum.tostring ()); hapus (0, tempnum. length ());} // Gunakan operator yang saat ini diperoleh untuk diprioritaskan dengan simbol perhitungan penumpukan: jika lebih tinggi, itu akan dihitung terlebih dahulu, diletakkan di bagian atas tumpukan; Elemen -elemen teratas dari tumpukan keluar dari tumpukan dan menghapus jumlah operasi operasi; // Tentukan prioritas simbol komputasi saat ini dan elemen atas tumpukan, keluarkan elemen, dan hitung (karena prioritas mungkin kurang dari elemen atas tumpukan, juga kurang dari elemen kedua, dll . Anda perlu menggunakan penilaian siklus). .pop (); // char pertama = pristack.pop (); = B + A; Hasil); Hasil operasi dalam jumlah operasi numStack. Karakter (temp.charat (0))); dalam braket untuk menghitung, dan menghapus tanda kurung propack.pop (); Setelah menerima jumlah digit yang dibaca dengan jumlah bacaan (ketika itu bukan satu digit)} return numstack.pop (); Private boolean isnum (string temp) {return temp.matches ("[0-9]");} / ** * Bandingkan simbol operasi saat ini dan simbol operasi elemen teratas dari tumpukan. dari tumpukan, mengembalikan true, jika tidak perlu untuk mengembalikan false * * * @param str. ()) {// Ketika kosong, itu jelas merupakan prioritas terendah. , ')' tidak bisa menjadi bagian atas tumpukan. if (last == '(') {return true;} switch (str) {case '#': return false; // karakter akhir "; case ')': // ')') 'prioritas terendah, return false; ') Return true;' untuk minimum, selalu kembali ke false case '+': return false; ew operate (); int t = operate.caculating ("(3+4*(4*10-10/2)#"); System.out.println (t);}}