Vor kurzem habe ich das Internet kürzlich überprüft, aber ich habe den Code für die vier von Java geschriebenen Operationen nicht gefunden, also senke ich ihn.
1. Erklärung
Der Code erreicht nur einfache vier Operationen, unterstützt+,-,*,/, (, (,) kann nur den richtigen Ausdruckswert berechnen, und es gibt keine Überprüfung des illegalen Ausdrucks.
2. Implementierungsmethode
Schritt 1: Konvertieren Sie die Eingangszeichenfolge in die Liste
Public list trans mus (string str) {list strlist = new ArrayList ();/* Holen Sie sich die Symbol -Zeichenfolgen der Daten*/String tmp = Str.ReplaceAll ("// d*", "");/* Aufzeichnen Sie die Aufzeichnung der Aktuelle Berechnungsfakultät*/ String Curlet = NULL;/*Zeichnen Sie die Position des ersten Operators im TMP -Zeichen*/ int loc = 0;/*Symbol Strings*/ int len = tmp.length (); i = 0; i <len; )) {Strist.Add (Str.Substring (0, loc) .trim ());} strlist.add (Str.Substring (loc, loc + 1)); if (0 <str.length ()) {strlist.add (str.trim ());} return strlist;}
Schritt 2: Konvertieren Sie den ursprünglichen mittelgroßen Ausdruck in den Suffix -Expression.
public String [] MidToend (List Midlist) {Stack embl = new stack (); = (String) iT.Next (); / * Bestätigen Sie, ob die Zeichenfolge formal ist = embl.size () || "(" .Equals (curstr)) {embl.push (curstr);} else { /*Wenn das Symbol ist) Der Symbolstapel muss bis zu einem aus dem Stapel sein * / if (")". result.push (embl.pop ());} embl.pop ();} else {int p1 = Integer.ParseInt ((String) Sign.get (curstr)); Sign.get (embl.peek ())); Sonst {while (p1 <= p2 || embl.size ()> 0) {result.push (embl.pop ()); ((String) Sign.get (embl.peek ()); .push (embl.pop ());} int len = result .size (); [Len -i -1] = (String) result.pop ();} return ret;}
Schritt 3: Das Endergebnis der Analyse des Suffix -Expression, wobei die Berechnung der Berechnung zurückgegeben wird
/ *** analysiert den Suffix -Ausdruck und gibt das entsprechende Operationsergebnis zurück* @param String [] endSTR Der konvertierte Suffix -Ausdruck* @return -Objekt gibt das Operationsergebnis zurück, wenn der Ausdruck falsch ist, drucken Sie "Eingabefehler direkt*/ öffentliches Objekt Berechnen (String [] endstr) {int len = endstr.Length; endst r [i]) {try {p2 = double.Parsed Allowance (String) callc.pop ()); ); Calc.Size ()) {return calc.pop ();} else {return "Eingabefehler";} /*** Implementierung Die zugrunde liegende Funktionsfunktion* @param Double P1 -Nummer 1* @param Double P1 -Nummer 2* @param String -Operator + -/ * */ public Double SimplyCalc (Doppel P1, Doppel P2, String -Operator) {Swit CH (Open.CHARAT (0)) {case ' +': return p1 +p2; -P2;
Schritt 4: Die Priorität des Bedieners wird zur Extraktion in den Cache platziert
Private statische Hashmap -Signal = neuer Hashmap (); ) Sign.put ("/", "2"); "0");}
Vollständiger Code
Java.util.ArrayList; und Divisions- und Klammeroperationen * zum Beispiel: 3+12+25 * (20-20/4) +10 * @Author Guobo 2009-3-16 * @Version 1.0 */public Class CalculateExp {private statische Hashmap-Sign = new h Ashhmap ();/*Geben Sie die Priorität des Bedieners in die Cache -Verarbeitung ein*/public Calling () {sign.put (")," 3 "); Sign.put ("*"," 2 "); Sign. put ("/", "2"); ); ) +10 * Das Ergebnis der Konvertierung ist: * Listenelement ist ret = {3,+,+, 25, *, (, 20, 20, 20, //, 4, 4,),+, 10} * /public list transstr (string str) {list strlist = new ArrayList ();/* Holen Sie sich die Symbol -Zeichenfolge der vorgeschlagenen Daten*/String tmp = str.replaceall ("// d*", "");/* Datensatz Der aktuelle Operator*/String curlet = null;/*Notieren Sie die Position des ersten Operators in der TMP -Zeichenfolge*/int loc = 0;/*Symbol String Länge*/int len = tmp.length (); int i = 0; i <len; () "". , Loc, loc, loc, loc, loc, loc + 1); );} Return strlist;}/*** weist Ausdrücke von Infix -Ausdrücken in Suffix -Ausdrücke (polnisch)* @paramliste Liste der Parsen -Ausdrücke* @return String [] Konvertierte Ausdrucksstring -Array*/public String [] Midtoend (Liste (Liste Midlist) {Stack embl = neuer Stack (); /if (sign.containesKey (curstr)) {/* Wenn der Symbolstapel leer ist oder das Symbol ist (*/if (0 == embl.size () || "(". ". Equals (curstr)) { Embl.push (curstr);} else {/*Wenn das Symbol ist) Der Symbolstapel muss bis eins aus dem Stapel aus sein (so weit*/if (")". Gleich (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)); Die aktuelle Zeichenpriorität des aktuellen Zeichens der Priorität als das obere Symbol des Stapels*/if (p1> p2) {embl.push (curstr);} else {while (p1 <= p2 || embl.size ()> 0) {Result.push (embl .pop ()); .push (curstr); (); Ret;}/*** Analyse -Suffix -Expression, geben Sie das entsprechende Operationsergebnis zurück* @param String [] endstr Der konvertierte Suffix -Ausdruck* @return -Objekt geben das Operationsergebnis zurück, wenn der Ausdruck falsch ist, drucken Sie "Eingabefehler"*/öffentliches Objekt Berechnen Sie [] endstr) {int len = endstr.Length; .ContainsKey (endstr [i])) {) {try {p2 = double.Parsed -Zulassung (String) CALLC.POP ()); i]));} catch (numberformatexception ex) {ex.printstacktrace (); [i]);}} if (1 == Calc.Size ()) {return calc.pop ();} else {return "Eingabefehler";}/*** Erkennen Sie die zugrunde liegende Computerfunktion* @param Double P1 Nummer 1 * @param Double P1 Nummer 2 * @param String-Operator +-/ * */public Double SimplyCalc (Double P1, Double P2, String-Operator) {Switch (oper.char unter (0)) {{case ' +' ' : Return p1 + p2; /platzieren ) CE.Calculate (CE.Midtoend (CE.TRANSSTR (TMP)); Double Value = 0; ;} System.out.print (Wert);}}
Das Folgende ist eine Ergänzung von anderen Internetnutzern
Die Idee des Codes besteht darin, jede Mindestberechnungseinheit durch regelmäßiges Urteilsvermögen zu berechnen. Das Folgende ist der Code:
importieren java.math.bigdecimal; import java.util.regex.matcher; import java.util.regex.pattern;/** * Calculator Toolklasse * @author shuqi * @date 2015-7-23 * @Version seit 1.0 * * @ /Public class Calculatorutil {public static bigDecimal arithmetic (String exp) {if (! Exp.matic ("// d+") {String result = parseexp (exp) .re placeall ("[//]"] "" " "," "); Rückgabe neuer BigDecimal (Ergebnis);} else {return New BigDecimal (exp);}/*** Mindestzählungseinheit ***/privat string =" ^^ ((// d+(// D+(// D+//. // d+)) izing (//./d+)?)|(////d+(//./d+)?//// ";/***Operation ohne Klammern*/private statische String notarentheses =" ^^ // (//)]+$ ";/*** Übereinstimmende Multiplikations- oder Divisionsmethode*/private String prioroperatexp = (// // D+(//./ D+)? /d+)?) |. ) || -1 (///// d+ // d+ off .//d+))|-1 (////-/d+ (// // d+)? ///////// ///////////////// Dmi)) ")") ")"; ** Analysieren und berechnen Sie die vier Operationenausdrücke, zum Beispiel: 2+((3+4) * 2-22)/2 * 3 * @param Ausdruck * @return */private statische String ParseExp (String-Ausdruck) {// Die Methode tritt zuerst in den Raum ein und ersetzt und entfernt die () Zahl auf beiden Seiten des Operation Expression = Expression.Replaceall ("// s +", "") .ReplaceAll ("^// (([^//) . 0? Ergebnis: "["+result+"]"; ); .Matcher (Ausdruck); Berechnen Sie vier Operationen mit Klammern Muster = muster ParseExp (tempMinexp)); = Exp.ReplaceAll ("[// [/]" "," "); String-Nummer [] = exp.ReplaceFirst (" (// d) [// d) [["//+//-/ /*///] "," $ 1 "). Split (", ","); Operator = exp.replacefirst ("^^.*// d ([/////////////// bus", "$ 1"), +". Equals (Operator)) {Ergebnis = Nummer1.Add (Nummer2); (Nummer2); Rund_ceiling);
Der Code war ursprünglich ein Blog, aber der Code hatte keine Kommentare und es gab einen Fehler. Nehmen Sie hier eine Notiz hier, um sie später einfach zu nutzen
Um dem ursprünglichen Autor respektieren zu können, ist der ursprüngliche Code beigefügt
/*** Berechnung der Ausdrucksberechnung von vier Operationen* @author penli**/public class Arithmetic {public static void main (String args []) {System.out.println (Arithmetic ("2.2+ ((3+4)* 2 - 22). (Ergebnis); Ausdruck) {// String numberreg = "^((?! 0) // d+(//./ D+(? <! 0))?) | (0 //./ D+(? <! 0) ) $ "; Expression = Expression.ReplaceAll (" // s+"," ") .ReplaceAll ("^// ((.+) //) $ "," $ 1 "); String ponkexp =" // d " ; //-//*// weibliche(//d+(//./d+)?)|(////d+(//./d+)?//])))))) $ "; // Die Berechnung der minimalen Expression if (expression.matches (minexp)) {String res) ult+"] ";} // Vier Operationen ohne Klammern String noparenthes ="^[^// (//)]+berechnen $ "; String prioroperatexp =" (((// d+(//./ d+)?) | (//[//-// d+(//./ D+)? //]) [// *///] (// d+(//// d+)?) | /]) "; String operateRexp =" ((// d+(//./ d+)?) | (// [// [// -// d+(//./ D+)? //] )) [//+//-] (// d+(//./ D+)?) | if (Expression.Matches (nicht)) {muster patt = muster.comPile (prioroperatexp); )} Else {ompile (operatexp); )} // vier von Klammern berechnen String minparentheses = "// [^// (/)]+//)"; ; Param Exp * @return */public static String berechnen (String exp) {exp = exp.Replaceall ("[//]", ""); ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::/D) [//+//-//*///] "," $ 1, " ). ////////// bin $ "," $ 1 "); if ("+". Equals (Operator)) {result = number1.add (Nummer2);} else if ("-". Equals (Equals (Equals () (Equals (Equals ( Operator) {result = number1.subract (Nummer2);} else if " *". = Nummer1.Divide (Nummer2);
Schließlich werde ich Ihnen die Implementierungsmethode eines Internetnutzer mit Ihnen teilen.
Java.util.Stack; IS: Verwenden des aktuell erhaltenen Operators mit den Pristack -Stapel -Top -Lüfter: Wenn er höher ist, wird er zuerst berechnet und in die Oberseite des Stapels gestellt. Operationen; Jede Priorität '('> ' *' = '/'> '+' = '-'> ')' * * */Public Class Operation {private Stack <Charnes> Pristack = New Stack <); Stack Private Stack <Ganzzahl> numstack = new Stack <Gearner> (); Überprüfung der Überprüfung)* @param str muss technischen Ausdruck ausgeführt. Um die Zeichenfolge zu analysieren. StringBuffer (). Append (str); // verwendet, um die Effizienz zu speichern und zu verbessern (String.Length ()! = 0) {temp = String.Substring (0, 1); / Richter Temp. tempnum if (! "" ". Equals (tempnum.toString ())) {// Wenn das erste Symbol des Ausdrucks die Klammer int num = Integer.ParseInt (tempnum.toString ()) ist, lösche (0, tempnum. Länge ());} // Verwenden Sie den aktuell erhaltenen Operator, um mit dem Stapelberechnungssymbol priorisiert zu werden. Die Top -Elemente des Stapels sind aus dem Stapel und entfernen die Betriebszahl der Operationen. // Bestimmen Sie die Priorität des aktuellen Computersymbols und das obere Element des Stapels, nehmen Sie die Elemente heraus und berechnen Sie (da die Priorität möglicherweise geringer ist als das obere Element des Stapels, es ist auch geringer als das zweite Element usw. . Sie müssen ein Zyklusurteil verwenden). .pop (); = B + A; Ergebnis; Das Betriebsergebnis in der operativen Anzahl von Numstack. Zeichen (temp.charat (0))); In der Klammer berechnen, und entfernen Sie die Klammern. Nach Erhalt der Anzahl der Ziffern der Anzahl der Lesevorgänge (wenn es sich nicht um eine einzelne Ziffer handelt)}} return numstack.pop (); Private boolean isnum (String temp) {return temp.matches ("[0-9]");} / ** * Vergleichen Sie die aktuellen Betriebsymbole und das obere Element-Betriebssymbole des Stapels. Der Stapel kehrt true zurück, ansonsten ist es notwendig, falsche * * * @param str. ()) {// Wenn es leer ist, ist es offensichtlich die niedrigste Priorität. , ')' kann nicht die Spitze des Stapels sein. if (last == '(') {return true;} switch (str) {case '#': return false; // das endende Zeichen "; case ')'": // ')') 'Die niedrigste Priorität, Return FALSE; ') RECHT WAHR; ew operation ();