최근에 인터넷을 확인했지만 Java가 작성한 4 가지 작업에 대한 코드를 찾지 못했습니다.
1. 설명
코드는 단순한 4 개의 작업 만 달성하며, 지원+,-,*, (, (,)는 올바른 표현식 값 만 계산할 수 있으며 불법 표현식의 검증은 없습니다.
2. 구현 방법
1 단계 : 입력 문자열을 목록으로 변환하는데, 주로 문자열을 원자로 변환하는 데 사용됩니다 : 값/연산자/브래킷
public list trans mary (string str) {list strlist = new arraylist ();/* 데이터의 기호 문자열을 가져옵니다*/String tmp = str.replaceall ( "// d*", "");/* 현재 계산 교수*/ String Curlet = NULL;/*TMP 문자의 첫 번째 연산자 위치를 기록하십시오*/*기호 문자열*/ int len = tmp.length (); i = 0; i ++; )) {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 (Midlist) {STACK EMBL = NEW STACK (); = (string) it.next (); 문자열이 공식적인지 확인 * / if (sign.containskey (curstr))) { / * 기호 스택이 비어 있거나 기호가 ( * / if (0 = = embl.size () ||. * / if ( ")". (curstr) {while (! "(". result.push (embl.pop ());} embl.pop ();} else {int p1 = integer.parseint ((string) sign.get (curstr)); sign.get (embl.peek ())); while (p1 <= p2 || embl.size ()> 0) {result.push (embl.pop ()); ((string) sign.get (embl.peek ()); .push (embl.pop ());} int len = restize (); [len -i -1] = (string) result.pop ();} return ret;}
3 단계 : 접미사 표현 분석의 최종 결과, 계산 계산을 반환합니다.
/ *** 접미사 표현식을 구문 분석하고 해당 작동 결과를 반환합니다* @param String [] Endstr 변환 된 접미사 표현식* @return 객체 표현식이 잘못된 경우 작업 결과를 반환하고 "입력 오류"직접 인쇄*/ 공개 개체 계산 (String [] endstr) endst r [i]) {try {p2 = double.parsed allowance (string) callc.pop ()); "입력 오류";} catch (예외) {ex.printstacktrace (); calc.size ()) {return calc.pop ();} else {return "input error";} /*** 구현 기본 작동 함수* @param double p1 번호 1* @param double p1 번호 2* @param 문자열 연산자 + -/ * */ public double simplecalc (Double P1, Double P2, String Operator) {swit ch (Open.charat (0)) {case ' +': P1 +P2를 반환합니다 -p2; 사례 * ': P1 * P2;
4 단계 : 연산자의 우선 순위는 추출을 위해 캐시에 배치됩니다.
개인 정적 해시 맵 부호 = 새로운 Hashmap (); 표시 ( "/", "2"); "0");}
완전한 코드
java.util.arraylist; import java.util.list; 및 부서 및 브래킷 작업 * 예 : 3+12+25 * (20-20/4) +10 * @Author Guobo 2009-3-16 * @version 1.0 */public class acempulateExp {private static hashmap 부호 = 새로운 H AshMap ();/*운영자의 우선 순위를 캐시 처리*/public calling () {sign.put ( "),"3 "); sign.put ("*","2 "); sign. put ( "/", "2"); "+", "1"; );} /*** 입력 표현식* @return list 구문 분석 문자열* 입력 문자열을 구문 분석* 예 : 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 String 길이*/int len = tmp.length (); int i = 0; i <len; curlet = tmp.substring (i, i+1); () "". , loc, loc, loc, loc, loc, loc + 1);} if (0 <str.length ()) {strlist.add (str.trim () );} return strlist;}/*** 표현식은 디스 픽스 표현식에서 접미어 표현식 (광택)으로 표현식을 변환합니다. Midlist) {STACK EMBLE ()는 새로운 스택 (); /if (sign.containskey (curstr)) {/* 기호 스택이 비어 있거나 기호가 (*/if (0 == embl.size () || "(". ".") { embl.push (curstr);} else {/*기호가있는 경우) 기호 스택은 하나까지 스택에서 벗어나야합니다 (지금까지*/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 ()); .push (curstr);}} else {result.push (curstr);} while (0 <embl.size ()) {result.push (embl.pop ());} int len = result.size (); string [] 새 문자열 [int i = 0; i <len; i ++) {reture (string) result.pop (); ret;}/*** 분석 접미사 표현식, 해당 작동 결과를 반환* @param string [] Endstr 변환 된 접미사 표현식* @return 객체 표현식이 잘못된 경우 작업 결과를 반환하고 "입력 오류"*/public 객체 {int len = endstr.length = double p1; .crantainskey (endstr [i])) {) {p2 = double.parsed alludance (string) p1 = double.parsed allowance ((string) callc.pop (); i]);} catch (numberformatexception ex) {ex.printstacktrace ();} catch (예외) {ex.printstacktrace ();}; [i]);}} if (1 == 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) {Switch (0)) {{Case ' +' : p1 + p2; /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 calculatorutil {public static bigdecimal arithmetic (string exp) {if (! exp.matic ( "// d+") {문자열 result = parseexp (exp) .re placeall ( "[// [//]]" " "," "); return new bigdecimal (결과);} else {return new bigdecimal (exp);}/*** 최소 계산 장치 ***/private string ="^^ (// d+(// d+(// d+//. // d+)) izing (//./d+)?) |//////d+(//./d+)?// ]))) ";/***브래킷이없는 작동*/개인 정적 문자열 notarentheses ="^^ // (//)]+$ ";/*** 일치하는 곱셈 또는 디비전 방법*/개인 문자열 purevoperatorexp ="(// d+(//./ d+) | //- // d+(//./ d+)) [//*//] /d+)) |. ) || -1 (///// D+ // D+ Off .//d+)) | 1 (////-/d+ (// // d+)? ///////// ////////////dmi)) ")") ")"; ** 4 가지 작업 표현식을 분석하고 계산하십시오. 예 : 2+((3+4) * 2-22)/2 * 3 * @param expression * @return */private static string parseexp (String Expression) {// 이 메소드는 먼저 공간을 입력하고 대체하고 조작의 양쪽 측면에서 () 숫자를 제거합니다. expression.replaceall ( "// s +", "") .replaceall ( "^// ([^// (/)]+) //) $ ","$ 1 "); // 최소 표현식 계산 if (expression.matches (minexp)) {문자열 result = calculation (expression); return double.parsedouble (result)> = 0? 결과 : "["+result+"]"; (mat.find) {string tempminexp = expression.replace (piboleoperatorexp, parseeexp (tempminexp)); . 패턴 패턴을 가진 4 개의 작업을 계산합니다 , parseexp (tempminexp)} parseexp (표현) /** * @param exp * @return * /private static string 계산 (string exp) {exp. = exp.Replaceall ( "[// [/]" "", ""); 문자열 번호 [] = Exp.ReplaceFirst ( "(// d) [[// d) [["//+//-/ ////] ","$ 1, " 연산자 = Exp.ReplaceFirst ( "^^.*// D ([//////////////////////////1"), +") {결과) {결과 = NUMBER1 (NURBER2); else ( "-" (NUMBER2);} else if ( "/". Equals (연산자)) {// 두 번째 매개 변수는 정밀도이고 세 번째는 4색의 5- 엔트리 모드 결과 = 번호 1 .divide (숫자 2,5, bigdecimal입니다. round_ceiling);} return result! = null? result.toString () : null};
코드는 원래 블로그 였지만 코드에는 댓글이 없었으며 버그가 조금 수정되었습니다. 나중에 쉽게 사용할 수 있도록 여기에 참고하십시오
또한 원래 저자에 대한 존중을 표현하기 위해 원본 코드가 첨부됩니다.
/*** 4 개의 작업 표현식 계산* @Author Penli**/public class Arithmetic {public static void main (String args []) {System.out.println (Arithmetic ( "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 * @param 표현 * @return */public static String parseexp (문자열 expression) {// string numberreg = "^(?! 0) // d+(//.// d+(? <! 0)) | (0 //./ d+(? <! 0) ) $ "; expression = expression.replaceall ("// s+"," ") .replaceall ("^// ((.+) //) $ ","$ 1 "); String checkexp ="// d " String minexp = "^(// d+(//./ d+)?) | (// [//-// d+(//./ d+)? //])) [//+ //-//*//] (//d+(//./d+) ?) |) |/////d+(//./d+)))))))))))) $ "; // 최소 표현식 계산 If (expression.matches (minexp)) {string res) ult+"] ";} // 브래킷없이 4 개의 작업을 계산하십시오. $ "; String PriorOperatorexp ="((// d+(//./ d+)?) | (//[//-// d+(//./ d+)? //]) [// *///] (// d+(//./ d+)?) | /]) "; String operatorexp ="(// d+(//./ d+)?) | (// [// [// -// d+(//./ d+)? //] )) [//+//-] (// d+(//./ d+)?) | if (expression.matches (not)) {pater patt.compile (mat.find ()) {string tempminexp = expression.replacefirs. ); else {operatorexp (expression); );} // 괄호 컴퓨팅 문자열 minparenthes = "// ([^//)]+//); if (mat.find ()) {string tempminexp = expression.replacefirst (tempminexp); param exp * @return */public static string 계산 (string exp) {exp = exp.replaceall ( "[// [//]]", ""); d) [//+//-//*///] ","$ 1, "). split (", "); bigdecimal number1 = new bigdecimal (숫자 [0]); 번호 [1]); bigdecimal result = null; exp.replacefirst ( "^.*// bin $", "$ 1"); if ( "+". 연산자)) {result = number1.add (number2);} else if ( "-". equals (operator)) {result = number1.subtract (number2);} else " *") {result = multiply (number2); else ( "/".
마지막으로 네티즌의 구현 방법을 공유하겠습니다.
java.util.stack은 스택을 사용하여 4 개의 스택을 사용하여 계산해야합니다 IS : Pristack Stack Top 팬과 함께 현재 얻은 연산자 사용 : 먼저 계산되어 스택의 상단에 놓아서 상단 요소가 스택에서 벗어나 작동 번호를 제거합니다. 작업의 경우; 동일합니다. 각 우선 순위 '('> ' *'= '/'> '+'= '-'> ')' * * */public class는 {private stack <atirect> pristack = new Stack <); 개인 스택 <integer> numstack = new 스택 <integer> (); // 구문 분석 해야하는 문자열의 통과/계산 결과를 반환합니다 (여기서 시간 문제로 인한 정당성 생략 검증)* @param str는 기술적 인 표현을 수행해야합니다* @return 계산 결과*/ public in (string str) {// 1. String String Temp에 불법 문자가 있는지 확인하십시오. 루프가 시작됩니다 문자열을 구문 분석하려면 문자열이 구문 분석되고 기호 스택이 비어있을 때 계산이 완료됩니다. stringbuffer tempnum = new StringBuffer (); // 숫자 문자열 (다중 자석 번호 일 때) StringBuffer String = new StringBuffer (). / themp. temp. temp가 연산자 인 경우 (! isnum (temp))) {// 1. 현재 작동 해야하는 숫자는 숫자를 꺼내고 스택을 누르고 눌러 지십시오. tempnum if (! "". 길이 ());} // 현재 획득 한 연산자를 사용하여 스태킹 계산 기호로 우선 순위를 지정합니다. 더 높으면 먼저 계산됩니다 스택의 상단 요소는 스택을 벗어나고 작업 수가 적은 경우 스택의 상단 요소 작업을 수행하고 결과를 작동 번호 스택에 넣습니다. // 현재 컴퓨팅 기호의 우선 순위와 스택의 상단 요소를 결정하고 요소를 꺼내고 계산합니다 (우선 순위는 스택의 상단 요소보다 작기 때문에 두 번째 요소보다 작습니다. . .pop (); // 첫 번째 char ope = pristack.pop () int result = 0; = b + a; // 작동 번호 numstack.push에 넣습니다. 결과); 운영 결과는 푸시 푸시 (reak)의 수를 기록합니다.}}}} 문자 (temp.charat (0))); 괄호 안에서 propack.pop ()를 제거합니다. 숫자 수를받은 후 읽기 수를 읽은 후 (단일 숫자가 아닐 때)} return numstack.pop (); 개인 부울 isnum (String temp) {return temp.matches ( "[0-9]");} / ** * 스택의 현재 작동 기호와 상단 요소 작동 기호를 비교합니다 스택의 경우 true를 반환합니다. 그렇지 않으면 False * * @param strity를 반환해야합니다. False는 스택의 최상위 요소보다 우선 순위가 낮습니다. ()) {// 비어있을 때 가장 낮은 우선 순위입니다. , ')'스택의 상단이 될 수 없습니다. if (last == '(') {return true;} switch (str) {case '#': return false; // 결말 문자 "; case ')': // ')') '가장 낮은 우선 순위, 거짓; case '*: {//'*/'=='-') reture false'/': {if (last =='+'|| last =='- ') return true;'최소의 경우, 항상 거짓 케이스로 돌아갑니다 '+': return false '-} true;} public static void main (String args []) {작동 = n EW Operate (); int t = Operate.caculating ( "(3+4*(4*10-10/2)); System.out.println (t);}}