لقد راجعت الإنترنت مؤخرًا ، لكنني لم أجد الرمز للعمليات الأربعة التي كتبها Java ، لذلك قمت بتخفيضه.
1. التفسير
يحقق الرمز فقط أربع عمليات بسيطة ، يدعم+،-،*،/، (، (،) فقط حساب قيمة التعبير الصحيحة ، ولا يوجد التحقق من التعبير غير القانوني.
2. طريقة التنفيذ
الخطوة 1: قم بتحويل سلسلة الإدخال إلى القائمة ، والتي تُستخدم بشكل أساسي لتحويل السلسلة إلى ذرات: القيمة/المشغل/الحامل
القائمة العامة trans must (String str) {list strlist = new ArrayList () ؛/* احصل على سلاسل الرموز للبيانات*/string tmp = str.replaceall ("// d*" ، "") ؛/* سجل CURCULE CURSEMONTER*/ String Curlet = NULL ؛/*سجل موضع المشغل الأول في حرف TMP*/ int loc = 0 ؛/*Symborts*/ int len = tmp.length () ؛ i = 0 ؛ )) {strist.add (str.substring (0 ، loc) .trim ()) ؛} strlist.add (str.substring (loc ، 1)) ؛ if (0 <str.length ()) {strlist.add (str.trim ()) ؛} return strlist ؛}
الخطوة 2: تحويل التعبير المتوسط الأصلي إلى تعبير اللاحقة.
السلسلة العامة [] MIDTOEND (LIST) {stack embl = new Stack () ؛ = (سلسلة) it.next () ؛ = embl.size () || * / if (")". result.push (embl.pop ())) ؛} embl.pop () ؛} آخر {int p1 = integer.parseint ( sign.get (embl.peek ())) ؛ آخر {بينما (p1 <= p2 || embl.size ()> 0) {result.push (embl.pop ()) ؛ ((سلسلة) sign.get (embl.peek ())) ؛ .push (embl.pop () [len -i -1] = (string) result.pop () ؛} return ret ؛}
الخطوة 3: النتيجة النهائية لتحليل تعبير اللاحقة ، وإعادة حساب الحساب
/ *** يوسع تعبير اللاحقة ويعيد نتيجة العملية المقابلة* param string [] Endstr التعبير اللاحقة المحولة* @كائن العودة (endstr) {int len = endster.length ؛ endst r [i]) {try {p2 = double.parsed accore (string) callC.Pop ()) ؛ ) ؛ calc.size ()) {return calc.pop () ؛} else {return "error error" ؛ String Operator + -/ * */ Public Double Simplecalc (Double P1 ، Double P2 ، string roprator) {Swit ch (Open.charat (0)) {case ' +': return p1 +p2 ؛ -P2 ؛
الخطوة 4: يتم وضع أولوية المشغل في ذاكرة التخزين المؤقت للاستخراج
علامة hashmap الخاصة = new hashmap () ؛ ) ؛ "0") ؛}
رمز كامل
استيراد java.util.arraylist وعمليات التقسيم والأسعار * على سبيل المثال: 3+12+25 * (20-20/4) +10 * Author Guobo 2009-3-16 * version 1.0 */class public calculateExp {private static hashmap sign = new h ashmap () ؛/*ضع أولوية المشغل في معالجة ذاكرة التخزين المؤقت*/public calling () {sign.put (") ،" 3 ") ؛ sign.put ("*"،" 2 ") ؛ علامة. put (/"،" 2 ") ؛ ) ؛ ) +10 * نتيجة التحويل هي: * عنصر القائمة هو ret = {3 ،+،+، 25 ، * ، (، 20 ، 20 ، // ، 4 ، 4 ،) ،+، 10} * * /قائمة عامة transstr (String str) {list strlist = new ArrayList () ؛/* احصل على سلسلة الرمز للبيانات المقترحة*/string tmp = str.replaceall ("// d*" ، "") ؛/* record المشغل الحالي*/String Curlet = null ؛/*سجل موضع المشغل الأول في سلسلة TMP*/int loc = 0 ؛/*طول سلسلة الرمز*/int len = tmp.length () ؛ int i = 0 ؛ () "". ، loc ، loc ، loc ، loc ، loc + 1) ؛ ستعمل strlist strlist ؛}/*** على تحويل التعبيرات من تعبيرات Infix إلى تعبيرات اللاحقة (البولندية)* قائمة قائمة التعبيرات المتخصصة* @Return string [] Argned Expression String Array*/Public String [] Midtoend (قائمة Midlist) {Stack embl = stack stack ( ) embl.push (curstr) ؛} آخر {/*إذا كان الرمز) ، يجب أن يكون مكدس الرمز خارج المكدس حتى الآن (حتى الآن*/if ("". "(" (. pop () ؛} else {int p1 = integer.parseint ((string) sign.get (curstr)) ؛ أولوية الحرف الحالية للحرف الحالية من الأولوية من الرمز العلوي للمكدس*/if (p1> p2) {embl.push (curstr) ؛} آخر {بينما (p1 <= p2 || embl.size ()> 0) {result.push (embl .pop ()) ؛ .push (curstr) ؛ () ؛ RET ؛}/*** تحليل اللاحقة التعبير ، أعد نتيجة العملية المقابلة* param string [] Endstr التعبير اللاحقة المحولة* @كائن العودة إلى نتيجة العملية إذا كان التعبير غير صحيح ، فقم بطباعة "خطأ الإدخال"*/كائن عام حساب (endstr) {int len = endstr.length ؛ .containskey (endstr [i])) {) I]) ؛} catch (numberFormatexception ex) {ex.printstacktrace () ؛ ] الرقم 1 * param double p1 رقم 2 * param string عامل +-/ * */public double simplecalc (double p1 ، double p2 ، string roperator) {switch (oper.char at (0)) {{case ' +' : Case P1 + P2 ؛ /ضع الفراغ الثابت (سلسلة [] args) {calcutionxp ce = new calculatingexp () ؛ ) ce.calculate (ce.midtoend (ce.transstr (tmp)) ؛ قيمة مزدوجة = 0 ؛ ؛
فيما يلي مكمل من مستخدمي الإنترنت الآخرين
فكرة التعليمات البرمجية هي حساب كل وحدة حساب أدنى من خلال الحكم العادي. ما يلي هو الرمز:
استيراد java.math.bigdecimal ؛ استيراد java.util.regex.matcher ؛ استيراد java.util.regex.pattern ؛/** * فئة أداة الآلة الحاسبة * Author Shuqi * date 2015-7-23 * @الإصدار منذ 1.0 * /فئة public calculatoruTil {public static bigdecimal arithmetic (سلسلة exp) {if (! exp.matic ("// d+") {string result = parseexp (exp) .re placeall ("[// [//]]" "" "" "" "" "" ، "") ؛ إرجاع جديد BigDecimal (نتيجة) ؛} آخر {إرجاع جديد BigDecimal (exp) ؛}/*** وحدة العد الأدنى ***/private string = "^^ ((// D+((// // d+(// d+//. // d+)) izing (//.//d+)؟emnylem ext "؛/***التشغيل بدون قوسين*/سلسلة ثابتة خاصة بالسلسلة الخاصة D+(//.// D+)؟ /D+)؟) |. )تش //////////////DMI)) ")") ")" ؛ ** تحليل وحساب تعبيرات العمليات الأربع ، على سبيل المثال: 2+((3+4) * 2-22)/2 * 3 * param expression * @return */private static string parseexp (تعبير السلسلة) {// تدخل الطريقة واستبدلت المساحة أولاً ، وتزيل الرقم () على جانبي العملية التعبير = expression.replaceall ("// s +" ، "") .replaceall ("^// (([^// (/)]+) //) $ "،" $ 1 ") ؛ // الحد الأدنى لحساب التعبير إذا (التعبير. 0؟ النتيجة: "[+result+"] " ) ؛ .matcher (التعبير) ؛ حساب أربعة عمليات مع نمط الأقواس = pattern ، parseexp (tempminexp)) ؛ = exp.replaceall ("[// [/]" "،" ") ؛ رقم السلسلة [] = exp.replacefirst (" (// d) [[// d) [["//+//-//// ////] "$ 1 ،") المشغل = exp.replacefirst ("^^.*// d ([/////////////// bus" ، "$ 1") ، +". يساوي (عامل التشغيل)) {النتيجة = number1.Add (number2) ؛ (رقم 2) ؛} آخر إذا ("/". Round_ceing) ؛
كان الرمز في الأصل مدونة ، لكن الكود لم يكن لديه تعليقات وكان هناك خطأ. قم بتدوين ملاحظة هنا لسهولة الاستخدام لاحقًا
بالإضافة إلى ذلك ، للتعبير عن الاحترام للمؤلف الأصلي ، يتم إرفاق الكود الأصلي
/*** أربعة عملية حساب تعبير التشغيل* Author Penli**/الفئة العامة الحساب {public static void main (string args []) {system.out.println (Arithmetic ("2.2+ ((3+4)* 2 - 22) /2*3.2 ")) ؛} الحساب العام الثابت (سلسلة exp) {String result = parseexp (exp) .replaceall (" [// [//]] "،" ") ؛ return double.parsed ouble (النتيجة) ؛ التعبير) {// string numberreg = "^((؟! 0) // d+(//.// d+(؟ <! 0))؟) | (0 // ) $ "؛ التعبير = التعبير ؛ //-//*///201: $ "؛ // حساب الحد الأدنى للتعبير إذا (التعبير. $ "؛ string propertoPeratorexp =" (((// d+(// *///] (// D+(//// D+)؟) | /]) "؛ string operatorexp =" ((// d+(//.// d+)؟) | (// [// -// d+(// )) [//+//-] (// d+(//.// d+)؟) | if (expression.matches (not)) ) ) ؛ param exp * regurn */public static string (exp) {exp.replaceall ("[// [//]]" ، "رقم السلسلة [] = exp.replacefirst (" (/: ::::::::::::::::::::::::: :::::::::::::::::::::: ::::::::::::::::::::::::: :::::::::::::::::::::: ::::::::::::::::::::::::::::/د) [//+//-//*///] "،" $ 1 ، " ). ///////// bin $ "،" $ 1 ") ؛ if ("+". يساوي (المشغل)) {result = number1.add (number2) ؛} آخر إذا ("-". المشغل)) {result = number1.subtract (number2) ؛} آخر إذا " *". = رقم 1
أخيرًا ، سوف أشارككم طريقة تنفيذ مستخدمي الإنترنت.
استيراد java.util.stack. هو: باستخدام المشغل الذي تم الحصول عليه حاليًا مع مراوح Pristack Stack: إذا كان أعلى ، فسيتم حسابه أولاً ووضعه في الجزء العلوي من المكدس ؛ من العمليات ؛ كل أولوية '('> ' *' = '/'> '+' = '>') ' * */الفئة العامة تعمل {private stack <Chirps> pristack = new stack <) ؛ مكدس خاص <integer> numstack = مكدس جديد <integer> () ؛ التحقق من التحقق)* Param Str يحتاج إلى تعبير تقني* RETURN REVIESS*/ Public في (String Str) {// 1. لتحليل السلسلة. stringBuffer (). إلحاق (str) ؛ // المستخدمة لحفظ وتحسين الكفاءة (string.length ()! = 0) {temp = string.substring (0 ، 1) ؛ / القاضي درجة الحرارة. tempnum if (! "" ". يساوي (tempnum.toString ())) {// عندما يكون الرمز الأول للتعبير هو القوس int num = integer.parseint (tempnum.toString ()) ؛ delete (0 ، tempnum. الطول ()) العناصر العليا من المكدس خارج المكدس وإزالة عدد عمليات التشغيل ؛ // حدد أولوية رمز الحوسبة الحالي والعنصر العلوي من المكدس ، وإخراج العناصر ، وحساب (لأن الأولوية قد تكون أقل من العنصر العلوي من المكدس ، كما أنه أقل من العنصر الثاني ، إلخ ، تحتاج إلى استخدام حكم دورة). .pop () ؛ = B + A ؛ النتيجة) ؛ النتيجة التشغيلية في النتيجة. الحرف (temp.charat (0))) ؛ في الحاسوب ، وإزالة الأقواس propack.pop () ؛ بعد تلقي عدد الأرقام القراءة إلى عدد القراءات (عندما لا يكون رقمًا واحدًا)} إرجاع numstack.pop () ؛ isnum boolean الخاص (temp) {return temp.matches ("[0-9]") ؛} / ** * قارن رموز التشغيل الحالية ورموز تشغيل العنصر العلوي للمكدس. من المكدس ، إرجاع صحيح ، وإلا من الضروري إرجاع خطأ * * param str. ()) {// عندما يكون ذلك فارغًا ، فهو أقل أولوية. ، ')' لا يمكن أن يكون الجزء العلوي من المكدس. if (last == '(') {return true ؛} switch (str) {case '#': return false ؛ عودة كاذبة ؛ ') العودة إلى حد ما ، دائما العودة إلى حالة كاذبة'+' EW التشغيل () ؛