java程序难题 用java编写一个数学公式解析器,要求能够实现任意正整数的加减乘除功能,并支持括号优先级,请注意代码质量,不允许调用语言自带的表达式解析功能来实现。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 中缀表达式转后缀表达式以前有人问过了,给你个链接,自己看吧http://topic.csdn.net/u/20110519/20/b23b6aaa-fd3f-4abb-aa1a-6f95b2ca9696.html 我的没法达到LZ要求的任意整数,我的最大到double的取值范围。 可以计算包含正负数、小数、括号的四则运算import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test{ public static void main(String[] args){ String result = compute("-2/6+-3"); System.out.println(result); } public static String compute(String expression){ expression = "(" + expression + ")"; String regex = "(.*?)(\\([^()]+\\))(.*)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(expression); while(matcher.find()){ expression = matcher.group(1) + compute1(matcher.group(2)) + matcher.group(3); matcher = pattern.matcher(expression); System.out.println(expression); } return expression; } private static String compute1(String expression){ /* 计算没有包含括号的情况下的结果 */ expression = expression.replaceAll("[( )]",""); String regex = "^(.*?)(\\d+(?:\\.\\d+)?)([/*])(-?\\d+(?:\\.\\d+)?)(.*)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(expression); double value1 = 0.0; double value2 = 0.0; String temp = null; while(matcher.find()){ value1 = Double.valueOf(matcher.group(2)); value2 = Double.valueOf(matcher.group(4)); if(matcher.group(3).equals("*")){ temp = (value1 * value2) + ""; }else{ temp = (value1 / value2) + ""; } expression = matcher.group(1) + temp + matcher.group(5); expression = expression.replaceAll("--","+"); matcher = pattern.matcher(expression); } //System.out.println(expression); regex = "^(.*?)((?:(?=[-+*/])-)?\\d+(?:\\.\\d+)?)([-+])(-?\\d+(?:\\.\\d+)?)(.*)"; pattern = Pattern.compile(regex); matcher = pattern.matcher(expression); while(matcher.find()){ value1 = Double.valueOf(matcher.group(2)); value2 = Double.valueOf(matcher.group(4)); if(matcher.group(3).equals("+")){ temp = (value1 + value2) + ""; }else{ temp = (value1 - value2) + ""; } expression = matcher.group(1) + temp + matcher.group(5); matcher = pattern.matcher(expression); } expression = expression.replaceAll("\\+",""); return expression; } } 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/micsolaris/archive/2010/07/29/5772782.aspx package CSDN;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;import javax.script.ScriptException;public class CalExpression_js { public static void main(String[] args) throws ScriptException { String ex = "(1+3)*(6-5)+6"; ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); System.out.print(engine.eval(ex)); }} LZ说了“不允许调用语言自带的表达式解析功能来实现。”用正则的 js的 都不合格啊 自己写的中缀转后缀,写的不好就当参考吧import java.util.ArrayList;import java.util.LinkedList;import java.util.Scanner;import java.util.Stack;public class Test6 { public static void main(String[] args) { System.out.println("请输入一个四则运算式:"); Scanner sc = new Scanner(System.in); String str = sc.nextLine()+"#"; LinkedList ll = m2(str); double result = m3(ll); System.out.println("结果= "+result); } /* * m方法对算术式各部分进行分级,结束标志#为-1,普通数值为0,+和-为1,*和/为2,‘(’为3,‘)’为4。 */ private static int m(Character c) { if(c.equals(')')) { return 4; } else if(c.equals('(')) { return 3; } else if(c.equals('*')||c.equals('/')) { return 2; } else if(c.equals(('+'))||c.equals('-')) { return 1; } else if(c.equals('#')) { return -1; } else return 0; } /* * 对算术式str进行后缀转换,从下标0到str.length-1结束。 * 转换成功后,后缀表达式保存在LinkedList里,并且返回,数值的保存类型为StringBuilder,操作符为Character. */ private static LinkedList m2(String str) { LinkedList ll = new LinkedList(); Stack<Character> al = new Stack<Character>(); al.add('#'); StringBuilder sb = new StringBuilder(); for(int i = 0; i < str.length();i++) { Character c = str.charAt(i); if(m(c)==0) { sb.append(c); } else if(m(c)>0||(m(c)<0&&!sb.toString().equals(""))) { if(!sb.toString().equals("")) { ll.add(sb); sb = new StringBuilder(); } if(m(c)-m(al.peek())>0&&m(c)!=4) { al.push(c); } else if(m(al.peek())==3) { al.push(c); } else if(m(c)!=4&&m(c)-m(al.peek())<=0&&m(c)!=-1) { while(m(c)-m(al.peek())<=0&&m(al.peek())!=3){ ll.add(al.pop()); } al.push(c); } else if(m(c)==4) { while(m(al.peek())!=3) { ll.add(al.pop()); } al.pop(); } else { while(m(al.peek())!=-1) { ll.add((al.pop())); } } } else { while(m(al.peek())!=-1) { ll.add((al.pop())); } } } return ll; } /* * 把转换成后缀式的算术式进行计算,result记录结果。 * 后缀式保存在LinkedList的一个对象ll里。 * 最后返回计算结果result. */ private static double m3(LinkedList ll) { double result = 0; for(int i = 0; i < ll.size();i++) { String str2 = ll.get(i).toString(); if(str2.equals("+")) { result = Double.valueOf(ll.get(i-2).toString())+Double.valueOf(ll.get(i-1).toString()); ll.set(i, result); ll.remove(i-2); ll.remove(i-2); i = i-2; } else if(str2.equals("-")) { result = Double.valueOf(ll.get(i-2).toString())-Double.valueOf(ll.get(i-1).toString()); ll.set(i, result); ll.remove(i-2); ll.remove(i-2); i = i-2; } else if(str2.equals("*")) { result = Double.valueOf(ll.get(i-2).toString())*Double.valueOf(ll.get(i-1).toString()); ll.set(i, result); ll.remove(i-2); ll.remove(i-2); i = i-2; } else if(str2.equals("/")) { result = Double.valueOf(ll.get(i-2).toString())/Double.valueOf(ll.get(i-1).toString()); ll.set(i, result); ll.remove(i-2); ll.remove(i-2); i = i-2; } } return result; }} 大哥你学java多久了,真复杂啊,高手真多啊。 帮我看看我的正则 MyImageIcon这个地方报错,郁闷中 Java Swing进度条显示问题 布局管理器间隔 请教JAVA的两个小问题 Exception in thread "main"java.lang.NoclassDefFoundError Think in Java中关于线程的一道习题不会做。 怎么样压缩成jar文件,使得文件直接可运行? 怎样将字符类型转为整型 weblogic console的用户和口令忘了,怎么办?(在不重装的情况下) 关于子类继承父类方法的 java 线程问题
以前有人问过了,给你个链接,自己看吧
http://topic.csdn.net/u/20110519/20/b23b6aaa-fd3f-4abb-aa1a-6f95b2ca9696.html
import java.util.regex.Pattern;
public class Test{
public static void main(String[] args){
String result = compute("-2/6+-3");
System.out.println(result);
}
public static String compute(String expression){
expression = "(" + expression + ")";
String regex = "(.*?)(\\([^()]+\\))(.*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(expression);
while(matcher.find()){
expression = matcher.group(1) + compute1(matcher.group(2)) + matcher.group(3);
matcher = pattern.matcher(expression);
System.out.println(expression);
}
return expression;
}
private static String compute1(String expression){
/*
计算没有包含括号的情况下的结果
*/
expression = expression.replaceAll("[( )]","");
String regex = "^(.*?)(\\d+(?:\\.\\d+)?)([/*])(-?\\d+(?:\\.\\d+)?)(.*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(expression);
double value1 = 0.0;
double value2 = 0.0;
String temp = null;
while(matcher.find()){
value1 = Double.valueOf(matcher.group(2));
value2 = Double.valueOf(matcher.group(4));
if(matcher.group(3).equals("*")){
temp = (value1 * value2) + "";
}else{
temp = (value1 / value2) + "";
}
expression = matcher.group(1) + temp + matcher.group(5);
expression = expression.replaceAll("--","+");
matcher = pattern.matcher(expression);
}
//System.out.println(expression);
regex = "^(.*?)((?:(?=[-+*/])-)?\\d+(?:\\.\\d+)?)([-+])(-?\\d+(?:\\.\\d+)?)(.*)";
pattern = Pattern.compile(regex);
matcher = pattern.matcher(expression);
while(matcher.find()){
value1 = Double.valueOf(matcher.group(2));
value2 = Double.valueOf(matcher.group(4));
if(matcher.group(3).equals("+")){
temp = (value1 + value2) + "";
}else{
temp = (value1 - value2) + "";
}
expression = matcher.group(1) + temp + matcher.group(5);
matcher = pattern.matcher(expression);
}
expression = expression.replaceAll("\\+","");
return expression;
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/micsolaris/archive/2010/07/29/5772782.aspx
package CSDN;import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;public class CalExpression_js {
public static void main(String[] args) throws ScriptException {
String ex = "(1+3)*(6-5)+6";
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
System.out.print(engine.eval(ex));
}
}
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Stack;
public class Test6 {
public static void main(String[] args) {
System.out.println("请输入一个四则运算式:");
Scanner sc = new Scanner(System.in);
String str = sc.nextLine()+"#";
LinkedList ll = m2(str);
double result = m3(ll);
System.out.println("结果= "+result);
}
/*
* m方法对算术式各部分进行分级,结束标志#为-1,普通数值为0,+和-为1,*和/为2,‘(’为3,‘)’为4。
*/
private static int m(Character c) {
if(c.equals(')')) {
return 4;
}
else if(c.equals('(')) {
return 3;
}
else if(c.equals('*')||c.equals('/')) {
return 2;
}
else if(c.equals(('+'))||c.equals('-')) {
return 1;
}
else if(c.equals('#')) {
return -1;
}
else return 0;
}
/*
* 对算术式str进行后缀转换,从下标0到str.length-1结束。
* 转换成功后,后缀表达式保存在LinkedList里,并且返回,数值的保存类型为StringBuilder,操作符为Character.
*/
private static LinkedList m2(String str) {
LinkedList ll = new LinkedList();
Stack<Character> al = new Stack<Character>();
al.add('#');
StringBuilder sb = new StringBuilder();
for(int i = 0; i < str.length();i++) {
Character c = str.charAt(i);
if(m(c)==0) {
sb.append(c);
}
else if(m(c)>0||(m(c)<0&&!sb.toString().equals(""))) {
if(!sb.toString().equals("")) {
ll.add(sb);
sb = new StringBuilder();
}
if(m(c)-m(al.peek())>0&&m(c)!=4) {
al.push(c);
}
else if(m(al.peek())==3) {
al.push(c);
}
else if(m(c)!=4&&m(c)-m(al.peek())<=0&&m(c)!=-1) {
while(m(c)-m(al.peek())<=0&&m(al.peek())!=3){
ll.add(al.pop());
}
al.push(c);
}
else if(m(c)==4) {
while(m(al.peek())!=3) {
ll.add(al.pop());
}
al.pop();
}
else {
while(m(al.peek())!=-1) {
ll.add((al.pop()));
}
}
}
else {
while(m(al.peek())!=-1) {
ll.add((al.pop()));
}
}
}
return ll;
}
/*
* 把转换成后缀式的算术式进行计算,result记录结果。
* 后缀式保存在LinkedList的一个对象ll里。
* 最后返回计算结果result.
*/
private static double m3(LinkedList ll) {
double result = 0;
for(int i = 0; i < ll.size();i++) {
String str2 = ll.get(i).toString();
if(str2.equals("+")) {
result = Double.valueOf(ll.get(i-2).toString())+Double.valueOf(ll.get(i-1).toString());
ll.set(i, result);
ll.remove(i-2);
ll.remove(i-2);
i = i-2;
}
else if(str2.equals("-")) {
result = Double.valueOf(ll.get(i-2).toString())-Double.valueOf(ll.get(i-1).toString());
ll.set(i, result);
ll.remove(i-2);
ll.remove(i-2);
i = i-2;
}
else if(str2.equals("*")) {
result = Double.valueOf(ll.get(i-2).toString())*Double.valueOf(ll.get(i-1).toString());
ll.set(i, result);
ll.remove(i-2);
ll.remove(i-2);
i = i-2;
}
else if(str2.equals("/")) {
result = Double.valueOf(ll.get(i-2).toString())/Double.valueOf(ll.get(i-1).toString());
ll.set(i, result);
ll.remove(i-2);
ll.remove(i-2);
i = i-2;
}
}
return result;
}
}