最近、私は最近インターネットをチェックしましたが、Javaによって書かれた4つの操作のコードが見つかりませんでした。
1。説明
コードは、単純な4つの操作のみを達成し、+、 - 、*、/、(、(、)をサポートします。
2。実装方法
ステップ1:入力文字列をリストに変換します。これは主に文字列を原子に変換するために使用されます:値/オペレーター/ブラケット
public list trans much(string str){list strlist = new arrayList();/*データのシンボル文字列を取得*/string tmp = str.replaceall( "// d*"、 "");/*記録現在の計算教員*/ string curlet = null;/*TMP文字の最初の演算子の位置*/ int loc = 0;/*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:元の媒体式をサフィックス式に変換します。サフィックス式は最も便利な計算です。
Public String [] Midlist){Stack embl = new stack() =(文字列)it.next(); = embl.size()||。 "(" .equals(curstr)){embl.push(curstr);} else { /*シンボルスタックはスタックから外出する必要があります(これまでのところ* / if( ")"(curstr) result.push(embl.pop());} embl.pop();} sign.get(embl.peek())); else {while(p1 <= p2 || embl.size()> 0){result.push(embl.pop()); ((string)sign.get(embl.peek()); .push(embl.pop();} int len = size(); [len -i -1] =(string)result.pop();} return ret;}
ステップ3:接尾辞式の分析の最終結果、計算の計算を返します
/ ***接尾辞式を解析し、対応する操作結果を返します* @param string [] endstr変換された接尾辞式* @returnオブジェクト操作結果を返します式が正しくない場合、「入力エラー」を直接印刷*/ publicオブジェクトを計算する(string){int len = length calc = new stack()for; endst r [i]){try {p2 = double.parsed(string)callc.pop()); ;} catch(例外){ex.printstacktrace() calc.size()){return calc.pop();} else {return "input error";} /***基礎操作機能* @param double p1 1* @param double p1 number 2* @param文字列演算子 + - / * */ public double simplecalc(double p1、double p2、string operator){open.charat(0)){case ' +':p1 +p2を返します-P2;
ステップ4:オペレーターの優先順位は、抽出のためにキャッシュに配置されます
private static hashmap sign = new Hashmap(); ; sign.put( "、"+"、" 1 "); "0");}
完全なコード
Import Java.util.util.itrator;および分割およびブラケット操作 *例:3+12+25 *(20-20/4)+10 * @author guobo 2009-3-16 * @version 1.0 */public class calculateExp {private static hashmap sign = new h ashmap();/*オペレータの優先度をキャッシュ処理に優先します*/public calling(){sign.put( ")、" 3 "); sign.put("*"、" 2 "); sign。 put( "/"、 "2"); ); *** @param文字列入力式* @return list parsed string要素*処理する必要があるデータに変換*例:3+12+25*(20-20 /4 )+10 *変換の結果は次のとおりです。 *リスト要素はret = {3、+、+、25、 *、(、20、20、20、/、4、4、)、+、10} *です。 /public List transstr(string str){list strlist = new arrayList();/*提案されたデータのシンボル文字列を取得*/string tmp = str.replaceall( "// d*"、 "");/* record現在の演算子*/string curlet = null;/*tmp文字列の最初の演算子の位置を記録します*/*シンボル文字列長*/int len = tmp.length(); int i = 0; () ""。 、loc、loc、loc、loc、loc、loc + 1); );} return strlist;}/***は、式をインフィックス式から接尾辞式(ポリッシュ)に変換します(ポリッシュ)* @paramリストの解析式* @return文字Midlist){stack embl = new stack = hew stack(); /if(sign.containskey(curstr)){/*シンボルスタックが空の場合、またはシンボルが(*/if(0 == embl.size()|| "("。 "。 embl.push(curstr);} else {/*シンボルがある場合)シンボルスタックは、1つ(これまでのところ*/if( ")"。 "("( ".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));スタックのトップシンボルよりも優先度の現在のキャラクターの現在のキャラクターの優先度*/if(p1> p2){embl.push(curstr);} else {while(p1 <= p2 || embl.size()> 0) {result.push(embl .pop()); if(0 == embl.size()){break;} p2 = integer.parseint((string)sign.get(embl.peek());} embl .push(curstr); (); string = new String [len]; ret;}/***分析接尾辞式、対応する操作結果を返します* @param string [] endstr変換された接尾辞式* @returnオブジェクト操作結果を返します式が正しくない場合、「入力エラー」を印刷*/publicオブジェクトcalcule(string){int len = length = new stack()for; .containskey(endstr [i])){){try {p2 = double.parsed(string)callc.pop()); i]);} catch(numberformatexception ex){ex.printstacktrace(); [i]);}} if(1 == calc.size()){return calc.pop();} else {return "input error";}/***基礎となるコンピューティング機能を実現* @param double p1番号1 * @param double P1番号2 * @param String operator + - / * */public double simplecalc(double p1、double p2、string operator){switch(oper.char at(0)){{case ' +' :P1 + P2を返す ' - P1 -P2を返します。 /place static void main(string [] args){calculatexp ce = new CalculatingExp(); )Ce.Calculate(Ce.MidToEnd(CE.Transstr(TMP)); Double Value = 0; ;} system.out.print(value);}}
以下は、他のネチズンからのサプリメントです
コードのアイデアは、定期的な判断を通じて各最小計算ユニットを計算することです。以下はコードです。
Import java.math.bigdecimal; import java.util.regex.matcher; import java.util.regex.pattern;/** *電卓ツールクラス * @author shuqi * @date 2015-7-23 * @バージョン1.0 * /public class calculaturetil {public static bigdecimal arithmetic(string exp){if(!exp.matic( "// d+"){string result = parseexp(exp).re placeall( "[// [//]]" "" "、" "); return new BigDecimal(result);} else {return new bigdecimal(exp);}/***最小カウントユニット***/private string =" ^^((// d+(((//)) d+(// d+//。// d+))izing(//.//d+)??)(////-//d+(/.///d+) ?//]))$ ";/**ブラケットなしの操作*/private static string notarentheses =" ^^ //(//)]+$ ";/***マッチング乗算または分割方法*/private string prioriperatorexp ="((// d+(//./ d+)?)| /d+)??)|。 )|| -1(///// d+ // d+ off .//d+)(////-/d+(// // d+)/////////////////// ////////// dmi)) ")") ")" //([^//(//)]+//) ";/* ** 4つの操作式を分析して計算します。たとえば、2+((3+4) * 2-22)/2 * 3 * @return */private static string parseexp(string expression){//このメソッドは最初に空間を入力して交換し、操作式= expression.replaceall( "// s +"、 "").replaceall( "^//([^///)の両側の()数値を削除します。 (/)]+)//)$ "、" $ 1 "); //最小式の計算if(expression.matches(minexp)){string result = calculate(expression); return double.parsedouble(result)> = = 0?result:["+result+"]; )if(mat.find()){string tempminexp = expression.Replace first(parseeexp(tempminexp);} .Matcher(express);ブラケットパターン= pattern.compile(minparenters)を計算します、parseexp(tempminexp)) = exp.replaceall( "[// [/]" "、" "); string number [] = exp.ReplaceFirst("(// d)[[// d)[["//+// - // /*//]、「$ 1」) operator = exp.ReplaceFirst( "^^。*// d([//////////////バス"、 "$ 1")、 +"。equals(operator)){result = number1.Add(number2); (number2); else if( "/"。equals(operator)){// 2番目のパラメーターは精度で、3番目は4色の5エントリモード= number1 .divide(number2,5、bigdecimalです。 round_ceiling)
コードはもともとブログでしたが、コードにはコメントがなく、バグがありました。簡単に使用できるように、ここでメモを取ります
さらに、元の著者を尊重するために、元のコードが添付されています
/*** 4操作式計算* @Author Penli**/public class arithmetic {public static void main(string args []){system.out.println(arithmetit( "2.2+((3+4)* 2) - 22)/2* 3.2 ");} public static double arithmetic(string exp){string result = parseexp(exp).replaceall(" [// [//]] "、" "); return double.parsed ouble (結果); ** * 4つの操作式の分析計算、例:2+((3+4) * 2-22)/2 * 3 * @return */public static string(string式){// string numberreg = "^((?!0)// d+(//./// d+(?<!0))|(0 //.// d+(?<!0) )$ "; expression = Expression.ReplaceAll(" // s+"、" ").Replaceall("^//(((。+)//)$ "、" $ 1 "); string checkexp =" // d " ;文字列minexp = "^(// d+(//.// d+))|(// - // d+(//.// d+)))[//+ //-//// $ "; //最小式の計算if(expression.matches(minexp)){string res)ult+"];} //ブラケットなしで4つの操作を計算する文字列noparenthes = "^[^//(//)]+ $ "; string priorteratorexp ="((((// d+(//./////)?)|(//[// - // d+(//./// d+))] [// *///](// d+(//./ d+)|)| /]) "; string operatorexp ="((// d+(//./// d+)?)|(// [// - // d+(//.// d+)?//] )[//+// - ](// d+(//./ d+)| if(expression.matches(not)){patterm = pattern.compile(priorteratexp); ;} else {operatorexp); );} //括弧の4つの計算文字列min parenthesses = "//([^//)+//)"; ; mat.find()){string tempminexp = expression.replacefirst(parseexp(tempminexp); PARAM exp * @return */public static string calculate(string exp){exp = exp.replaceall( "[// [//]]、" "= exp.replaceFirst("(//// d)[//+// - //*///]、 "$ 1、")。split( "、"); bigdecimal number1 = new bigdecimal(number [0]); number [1]); bigdecimal result = null; string operator = exp.replacefirst( "^。*// d([///////// bin $"、 "$ 1"); operator){result = number1.add(number2);} else if( " - "。equals(operator)){result1.subtract(number2);} else if " *" {result = multiply(number2);} if(equals){number1.divide(number2);
最後に、ネチズンの実装方法を共有します。
Java.util.StackをインポートしますIS:Pristack Stackのトップファンを使用して現在取得したオペレーターを使用します。最初に計算され、スタックの上部に置かれます。操作は、それが少ない場合、同じことがスタックの上位要素操作を取り出します。各優先順位 '('> ' *' = '/'+'=' - '>') ' * */public class operate {private stack <character> pristack = new stack <);スタックプライベートスタック<integer> numstack = new Stack <integer>();検証の検証)* @Param STRは、技術的な表現を実行する必要があります* @return計算結果* // 1.文字列が解析され、シンボルスタックが空の場合、計算が完了します。 stringbuffer()。append(str); //効率を保存して改善するために使用されます。 /裁判官の場合。 tempnum if(! "" "。equals(tempnum.tostring())){//式の最初のシンボルがブラケットint num = integer.parseint(tempnum.tostring()); delete(0、tempnumの場合。 length());} //現在取得した演算子を使用して、スタッキング計算記号を優先します。最初に計算され、後で計算されますスタックの最上位要素は、操作数が少ない場合は、操作数を削除します。 //現在のコンピューティングシンボルとスタックの最上位要素の優先度を決定し、要素を取り出して計算します(優先度はスタックの上部要素よりも少ない可能性があるため、2番目の要素よりも少ないためです。 。、(0)を使用する必要があります。(0)。 .pop(); = b + a //操作番号numstack.push(result);結果)操作結果の操作数(結果)文字(temp.Charat(0)))括弧を計算し、propack.pop();}}を削除します。読み取り数を受信した後、読み取り数(1桁ではない場合)} numstack.pop(); Private Boolean Isnum(String Temp){return temp.matches( "[0-9]");} / ** *現在の操作記号と、スタックの上部要素の動作記号を比較しますスタックの場合、真実を返します。そうしないと、false * * * @param strを返す必要があります。 ()){//それが空の場合、それは明らかに最小の優先順位です=(char)propack.lastelement(); 、 ')'はスタックの一番上にすることはできません。 if(last == '('){return true;} switch(str){case '#':return false; //終了文字 "; case ')':// ')') '最優先度、 false; case '*':{// '==') ')true; ew operate(); int t = operate.caculating( "(3+4*(4*10-10/2);