Недавно я проверил Интернет, но я не нашел код для четырех операций, написанных Java, поэтому я опускаю его.
1. Объяснение
Код достигает только простых четырех операций, поддерживает+,-,*,/, (, (,) может только рассчитывать правильное значение выражения, и не существует проверки незаконного выражения.
2. Метод реализации
Шаг 1: преобразовать входную строку в список, который в основном используется для преобразования строки в атомы: значение/оператор/кронштейн
Публичный список транс -много (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 [] Midtoend (List Midlist) {Stack embl = new Stack (); = (String) it.next (); / * Подтвердите, является ли строка формальной * / if (sign.containske = embl.size () || "(". * / if (")". result.push (embl.pop ()));} embl.pop ();} else {int p1 = integer.parseint ((string) sign.get (curstr)); 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 = result .size (); [Len -i -1] = (String) result.pop ();} return ret;}
Шаг 3: Окончательный результат анализа выражения суффикса, возвращая расчет расчета
/ *** Подбирает выражение суффикса и возвращает соответствующий результат операции* @param string [] endstr Установленное суффиксное выражение* @return Объект возврат результат операции, если выражение неверное, печати «Ошибка ввода» напрямую*/ Общественный объект Рассчитайте, вычислите расчеты. (String [] endstr) {int len = endstr.length; Endst R [i]) {try {p2 = double.parsed Allowance (String) callc.pop ()); ); Calc.size ()) {return calc.pop ();} else {return "input error";} /*** Реализация Функция базовой операции* @param Double P1 № 1* @param Double P1 Номер 2* @param Оператор строки + -/ * */ public double simplecalc (двойной P1, Double P2, String Operator) {Swit ch (open.Charat (0)) {case ' +': return p1 +p2; -p2;
Шаг 4: Приоритет оператора помещается в кэш для извлечения
Private Static Hashmap Sign = new HashMap (); ); "0");}
Полный код
Импорт java.util.arraylist; и операции дивизии и кронштейна * Например: 3+12+25 * (20-20/4) +10 * @author guobo 2009-3-16 * @version 1.0 */public Class Canculateexp {Private Static Hashmap Sign = New H ashmap ();/*Поместите приоритет оператора в обработку кэша*/public cl put ("/", "2"); ); ) +10 * Результатом преобразования является: * Элемент списка ret = {3,+,+, 25, *, (, 20, 20, 20, //, 4, 4,),+, 10} * /public list transstr (string str) {list strlist = new arraylist ();/* Получить строку символа предлагаемых данных*/string tmp = str.replaceall ("// d*", "");/* Запись текущий оператор*/string curlet = null;/*Запишите положение первого оператора в строке TMP*/int loc = 0;/* int i = 0; () "". , Loc, loc, loc, loc, loc, loc, loc + 1); );} Return strlist;}/*** будет преобразовать выражения из экспрессии Infix в суффикс экспрессии (польский)* @param Список проанализированных выражений* @return String [] преобразованный массив строки выражения*/public String [] Midtoend (список midlist) {stack embl = new Stack (); /if (sign.containskey (curstr)) {/* Если стек символов пуст или символ (*/if (0 == embl.size () || "(". ". Equals (curstr)) { Embl.push (curstr);} else {/*Если символ есть), стек символов должен быть вне стека, пока один (пока*/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)); Текущий приоритет текущего символа приоритета символа, чем верхний символ стека*/if (p1> p2) {embl.push (curstr);} else {while (p1 <= p2 || embl.size ()> 0) {Result.push (embl .pop ()); .push (curstr); (); Ret;}/*** Анализ суффикс выражение, верните соответствующий результат операции* @param string [] endstr Установленное суффиксное выражение* @return Объект вернуть результат операции, если выражение неверное, печатная ошибка ввода »*/public объект Рассчитайте (string [] endstr) {int len = endstr.length; .containskey (endstr [i])) {) {try {p2 = double.parsed Allowance (String) callc.pop ()); i]));} catch (numberFormateXception ex) {ex.printStackTrace (); [i]);}} if (1 == calc.size ()) {return calc.pop ();} else {return "error";}/*** реализуйте базовую вычислительную функцию* @param double p1 Номер 1 * @param Double P1 Номер 2 * @param String Operator +-/ * */public Double Simplecalc (Double P1, Double P2, String Operator) {Switch.Char.CHAR AT (0)) {{Case ' +' : Вернуть P1 + P2; /Поместите статический void main (string [] args) {coundetxp ce = new CalculationExp (); ) ce.calculate (ce.midtoend (ce.transstr (tmp)); двойное значение = 0; ;
Ниже приводится дополнение от других пользователей сети
Идея кода состоит в том, чтобы вычислять каждую единицу минимального расчета посредством регулярного суждения. Ниже приведено код:
Импорт java.math.bigdecimal; import java.util.regex.matcher; import java.util.regex.pattern;/** * Класс инструмента калькулятора * @author shuqi * @date 2015-7-23 * @версия с 1.0 * /Public Class Calculatorutil {public static BigDecimal Arithmetic (String exp) {if (! Exp.matic ("// d+") {String result = parseexp (exp) .re placeAll ("[// [//]]" "" "," "); Вернуть новый BigDecimal (result);} else {return new BigDecimal (exp);}/*** Минимальный подсчет ***/Private String =" ^^ ((// d+((// d+(// d+//. // d+)) izing (//./d+)?)(//n ";/***Операция без скобков*/частная статическая строка Notarentheses =" ^^ // (//)]+$ ";/*** Сопоставление умножения или метода деления*/частная строка Pionoperatorexp =" (// D+(//// D+)? /d+)?) |. ) || -1 (////// D+ // d+ off .//d+)))-1 (////-/d+ (// // d+)? /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////другим ///////////////dmi))) ")") ")"; minparentheses = "// ([^// (//)]+//)";/* ** Проанализируйте и вычислите четыре операционных выражения, например: 2+((3+4) * 2-22)/2 * 3 * @param выражение * @return */private Static String parseexp (строка выражение) {// Метод сначала входит и заменяет пространство и удаляет число () с обеих сторон операции Expression = Expression.Replaceall ("// s +", "") .replaceall ("^// ((^// (/)]+) //). 0? Результат: "["+Результат+"]"; ); .matcher (Express); Рассчитайте четыре операции с шаблоном скобков = Pattern.compile (minparentheses); , parseexp (tempminexp)); = Exp.ReplAceall ("[// [/]" "," "); строковое число [] = exp.replacefirst (" (// d) [[// d) [["//+//-/ ////] "," $ 1, "). Split (", ","); Operator = exp.replacefirst ("^^.*// d ([///////////////// bus", "$ 1"), +". Equals (operator)) {Результат = number1.add (number2); (number2); Round_ceiling);
Первоначально код был блогом, но у кода не было комментариев, и была ошибка. Запишите здесь для легкого использования позже
Кроме того, чтобы выразить уважение к первоначальному автору, прикреплен исходный код
/*** Четыре расчета эксплуатации выражения 22) /2*33.2 "));} public Static Double Arithmetic (String exp) {string result = parseexp (exp) .replaceall (" [// [//]] ","); return double.parsed ouble (Результат); Выражение) {// string numberreg = "^(?! 0) // d+(///// d+(? <! 0))?) | (0 ///// d+(? <! 0) ) $ "; Expression = Express.ReplAceall (" // s+"," ") .replaceall ("^// ((.+) //) $ "," $ 1 "); String checkexp =" // d " ; //-///*/////n(//d+(/..//d+)?)|(//n $ "; // Расчет минимального выражения if (Expression.matches (minexp)) {string res) ult+"] ";} // Рассчитайте четыре операции без скобков String noparenthes ="^[^// (//)]+ $ "; String priwerOperatorexp =" (((// d+(///// d+)?) | (//[//-// d+(//// d+)? //]) [// *///] (// d+(///// d+)?) | /]) "; string operatorexp =" ((// d+(///// d+)?) | (// [// [// -// d+(///// d+)? //] ) [//+//-] (// d+(///// d+)?) | if (Express.matches (not)) {pattern patt = pattern.compile (PrioroPherexp); ;} Else {ompile (operatorexp); );} // Рассчитайте четыре скобки, вычислительные строки minparenthes = "// ([^// (/)+//)"; ; Param Exp * @return */public Static String Culdulate (String exp) {exp = exp.replaceall ("[// [//]]", ""); ::::::::::::::::: ::::::::::::::::: ::::::::::::::::::::::::: ). //////////// bin $ "," $ 1 "); if ("+". equals (operator)) {result = number1.add (number2);} else if ("-". equals ( Оператор)) {result = number1.subtract (number2);} else " *". = Number1.divide (№2);
Наконец, я поделюсь с вами методом реализации сети.
Import Java.Util.Stack; IS: Использование в настоящее время оператора с вентиляторами Pristack Stack: если он выше, он будет рассчитан сначала и поместите его в верхнюю часть стека; операций; * Если это меньше, то же самое. Каждый приоритет '('> ' *' = '/'> '+' = '-'> ')' * * */public class operaint {private stack <carment> pristack = new Stack <); // Операционное зонирование Stack Private Stack <Integer> numstack = new Stack <Integer> (); Проверка проверки)* @param STR должен выполнить техническое выражение* @return Результаты расчета*/ public in (String str) {// 1. Определить, есть ли незаконные символы в строковой строке Temp; Проанализировать строку. StringBuffer (). Append (str); // Используется для сохранения и повышения эффективности (string.length ()! = 0) {temp = string.substring (0, 1); / Судья темп. Tempnum if (! "".. Equals (tempnum.tostring ())) {// Когда первым символом выражения является кронштейн int num = integer.parseint (tempnum.tostring ()); удалить (0, tempnum. Length ());} // Использование в настоящее время получаемого оператора для приоритета с помощью символа расчета укладки: если он будет выше, он будет рассчитан сначала, положить на верхнюю часть стека; Верхние элементы стека находятся вне стека и удаляют рабочее количество операций; // Определите приоритет текущего вычислительного символа и верхнего элемента стека, выберите элементы и рассчитывайте (потому что приоритет может быть меньше, чем верхний элемент стека, он также меньше, чем второй элемент и т. Д. ., Вам нужно использовать велосипедное суждение). .pop (); = b + a; Результат); Операционный результат в рабочем количестве Numstack. Символ (temp.charat (0))); В кронштейне для расчета и удалить скобки Propack.pop (); После получения количества цифр считывается на количество чтения (когда это не одна цифра)} вернуть numstack.pop (); Private Boolean Isnum (String Temp) {return temp.matches ("[0-9]");} / ** * Сравните текущие рабочие символы и символы, работающие на верхнем элементе стека. стека возвращает True, в противном случае необходимо вернуть False * * * @param str. ()) {// Когда он пуст, это, очевидно, самый низкий приоритет. , ')' не может быть вершиной стека. if (last == '(') {return true;} switch (str) {case '#': вернуть false; // конечный символ "; case ')': // ')') 'самый низкий приоритет, вернуть false; ') Вернуть True; EW Operate ();