字符映射计算 String str="((((2+3)/1)+5)-2)*((9-5)/2+3)";如何计算得到((((2+3)/1)+5)-2)*((9-5)/2+3)的值?就是将字符串解析后计算出对应的数值 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 代码太长了LZ我就不贴了 您自己看看吧应该copy下就可以用了http://shirui-java.javaeye.com/blog/317447/** * 测试 * @param args */ public static void main(String[] args) { String gs = "if(4 > 3,if( ( 2 - 1 ) / ( 0.0001 ) * 3 > 3 , ( 2 - ( 2 - 1 ) / ( 0.0001 ) * 3 ) * 0.8 ,0), ( 2 + ( 3 - 2 ) / ( 0.0001 ) *1 ) * 1)"; // 进行四则运算获得结果 System.out.println(szys(strCast("3-4*-5+5"))); System.out.println(calculate(strCast("3-4*-5+5"))); // 函数运算结果 System.out .println(calculate(strCast("3+abs(mod(4,if(2>3,1,3))-abs(2*4))*5+5"))); System.out.println(calculate(strCast("if(0.0*2>=10.0,0,10.0-0.0*2)"))); System.out.println(calculate(strCast("if(0<2,(10.0-0*5)*0.8,0)"))); System.out.println(calculate(strCast("-10/0"))); } 我自己写了一个,只能算非负整数的程序。由于不能实现负数,注释也没有什么意思了。抛砖看看能不能引来玉://本程序只能计算正整数范围内的加减乘除运算。import java.util.*;public class Expression{ //优先级数组,precede[i][j],表示第i个操作符与第j个操作符的优先级,0,1,2,3,4,5,6分别是'+', '-', '*', '/', '(', ')', '#' //0表示,第i个操作符优先级小于第j个操作符。1表示大于,2表示相等,3是表示不可能的。 int precede[][]={{1 , 1 , 0 , 0 , 0 , 1 , 1}, {1 , 1 , 0 , 0 , 0 , 1 , 1}, {1 , 1 , 1 , 1 , 0 , 1 , 1}, {1 , 1 , 1 , 1 , 0 , 1 , 1}, {0 , 0 , 0 , 0 , 0 , 2 , 3}, {1 , 1 , 1 , 1 , 3 , 1 , 1}, {0 , 0 , 0 , 0 , 0 , 3 , 2}}; char[] operate={'+', '-', '*', '/', '(', ')', '#'}; String exp=null; public Expression(String exp){ this.exp=exp; } int getValueInt(){ Stack<Integer> optr=new Stack<Integer>(); Stack<Integer> opnd=new Stack<Integer>(); String expression=exp+"#"; //给表达式加一个运算符,且是一个结束符 optr.push(6); //先把'#'操作符对应的序号入栈。 int index=0; //从0开始扫描表达式字符串。 //int sign=1; //符号,假设为正 int num=0; char c=expression.charAt(index++); while(c!='#'||optr.peek()!=6){ if(indexOperate(c)==-1){ /*if(c=='-'){ sign=-1; c=expression.charAt(index++); }else if(c=='+'){ c=expression.charAt(index++); }*/ while(c>='0'&&c<='9'){ num=num*10+c-'0'; c=expression.charAt(index++); System.out.println("num="+num); } opnd.push(num); //sign=1; num=0; } if(indexOperate(c)==-1){ System.out.println("Expression is Error!"); System.exit(0); } switch(precede[optr.peek()][indexOperate(c)]){ case 0 : optr.push(indexOperate(c)); c=expression.charAt(index++); break; case 1 : int num2=opnd.pop(); int opt=optr.pop(); int num1=opnd.pop(); opnd.push(binaryOperation(num1,opt,num2)); System.out.println(binaryOperation(num1,opt,num2)); break; case 2 : optr.pop(); c=expression.charAt(index++); break; case 3 : System.out.println("括号不配对Expression Error!"); System.exit(0); }//switch }//while return opnd.peek(); } int indexOperate(char c){ for(int i=0;i<operate.length;i++){ if(operate[i]==c) return i; } return -1; } int binaryOperation(int operand1,int opt,int operand2 ){ switch(opt){ case 0: return operand1+operand2; case 1: return operand1-operand2; case 2: return operand1*operand2; case 3: return operand1/operand2; } return 0; } public static void main(String[] args){ //Expression e=new Expression("((((2+3)/1)+5)-2)*((9-5)/2+3)"); Expression e=new Expression("1+5"); System.out.println(e.getValueInt()); //System.out.println(e.getValueInt("(5+3)*2")); }} 重贴一次,把我调试的一些语句去掉://本程序只能计算正整数范围内的加减乘除运算。import java.util.*;public class Expression{ //优先级数组,precede[i][j],表示第i个操作符与第j个操作符的优先级,0,1,2,3,4,5,6分别是'+', '-', '*', '/', '(', ')', '#' //0表示,第i个操作符优先级小于第j个操作符。1表示大于,2表示相等,3是表示不可能的。 int precede[][]={{1 , 1 , 0 , 0 , 0 , 1 , 1}, {1 , 1 , 0 , 0 , 0 , 1 , 1}, {1 , 1 , 1 , 1 , 0 , 1 , 1}, {1 , 1 , 1 , 1 , 0 , 1 , 1}, {0 , 0 , 0 , 0 , 0 , 2 , 3}, {1 , 1 , 1 , 1 , 3 , 1 , 1}, {0 , 0 , 0 , 0 , 0 , 3 , 2}}; char[] operate={'+', '-', '*', '/', '(', ')', '#'}; String exp=null; public Expression(String exp){ this.exp=exp; } int getValueInt(){ Stack<Integer> optr=new Stack<Integer>(); Stack<Integer> opnd=new Stack<Integer>(); String expression=exp+"#"; //给表达式加一个运算符,且是一个结束符 optr.push(6); //先把'#'操作符对应的序号入栈。 int index=0; //从0开始扫描表达式字符串。 //int sign=1; //符号,假设为正 int num=0; char c=expression.charAt(index++); while(c!='#'||optr.peek()!=6){ if(indexOperate(c)==-1){ /*if(c=='-'){ sign=-1; c=expression.charAt(index++); }else if(c=='+'){ c=expression.charAt(index++); }*/ while(c>='0'&&c<='9'){ num=num*10+c-'0'; c=expression.charAt(index++); } opnd.push(num); //sign=1; num=0; } if(indexOperate(c)==-1){ System.out.println("Expression is Error!"); System.exit(0); } switch(precede[optr.peek()][indexOperate(c)]){ case 0 : optr.push(indexOperate(c)); c=expression.charAt(index++); break; case 1 : int num2=opnd.pop(); int opt=optr.pop(); int num1=opnd.pop(); opnd.push(binaryOperation(num1,opt,num2)); break; case 2 : optr.pop(); c=expression.charAt(index++); break; case 3 : System.out.println("括号不配对Expression Error!"); System.exit(0); }//switch }//while return opnd.peek(); } int indexOperate(char c){ for(int i=0;i<operate.length;i++){ if(operate[i]==c) return i; } return -1; } int binaryOperation(int operand1,int opt,int operand2 ){ switch(opt){ case 0: return operand1+operand2; case 1: return operand1-operand2; case 2: return operand1*operand2; case 3: return operand1/operand2; } return 0; } public static void main(String[] args){ Expression e=new Expression("((((2+3)/1)+5)-2)*((9-5)/2+3)"); //Expression e=new Expression("1+5"); System.out.println(e.getValueInt()); }} 要么自己通过堆栈、逆波兰式等自己实现,要么就使用动态语言工具。比如说:JDK 6 中 JavaScript、开源的 BeanShell 等的 eval 函数,当然了这些函数的实现也是通过编译原理实现的,只是做了一些更高层次的封装,让我们直接使用。 java gui问题 jcreator编译时出现警告: 编码 GBK 的不可映射字符。 这题目……好像理解错了…… 出现未签名错误 怎么解决 Socket编程时,出现的一个异常!!请大侠们帮帮忙!!! 请教一个释放内存的问题 两个类的两个对象,怎么去改变对方啊。 救急!!!!! jcreator2.5里运行时怎么加上参数呀,谢谢 《java2 图形设计 卷II:SWING 》这本书大家觉得怎么样?我看不明白~ sql server2000 select 表名为变量 java语句如何写? java小问题
* 测试
* @param args
*/
public static void main(String[] args) { String gs = "if(4 > 3,if( ( 2 - 1 ) / ( 0.0001 ) * 3 > 3 , ( 2 - ( 2 - 1 ) / ( 0.0001 ) * 3 ) * 0.8 ,0), ( 2 + ( 3 - 2 ) / ( 0.0001 ) *1 ) * 1)";
// 进行四则运算获得结果
System.out.println(szys(strCast("3-4*-5+5")));
System.out.println(calculate(strCast("3-4*-5+5")));
// 函数运算结果
System.out
.println(calculate(strCast("3+abs(mod(4,if(2>3,1,3))-abs(2*4))*5+5"))); System.out.println(calculate(strCast("if(0.0*2>=10.0,0,10.0-0.0*2)"))); System.out.println(calculate(strCast("if(0<2,(10.0-0*5)*0.8,0)"))); System.out.println(calculate(strCast("-10/0"))); }
//本程序只能计算正整数范围内的加减乘除运算。
import java.util.*;public class Expression{
//优先级数组,precede[i][j],表示第i个操作符与第j个操作符的优先级,0,1,2,3,4,5,6分别是'+', '-', '*', '/', '(', ')', '#'
//0表示,第i个操作符优先级小于第j个操作符。1表示大于,2表示相等,3是表示不可能的。
int precede[][]={{1 , 1 , 0 , 0 , 0 , 1 , 1},
{1 , 1 , 0 , 0 , 0 , 1 , 1},
{1 , 1 , 1 , 1 , 0 , 1 , 1},
{1 , 1 , 1 , 1 , 0 , 1 , 1},
{0 , 0 , 0 , 0 , 0 , 2 , 3},
{1 , 1 , 1 , 1 , 3 , 1 , 1},
{0 , 0 , 0 , 0 , 0 , 3 , 2}};
char[] operate={'+', '-', '*', '/', '(', ')', '#'};
String exp=null;
public Expression(String exp){
this.exp=exp;
}
int getValueInt(){
Stack<Integer> optr=new Stack<Integer>();
Stack<Integer> opnd=new Stack<Integer>();
String expression=exp+"#"; //给表达式加一个运算符,且是一个结束符
optr.push(6); //先把'#'操作符对应的序号入栈。
int index=0; //从0开始扫描表达式字符串。
//int sign=1; //符号,假设为正
int num=0;
char c=expression.charAt(index++);
while(c!='#'||optr.peek()!=6){
if(indexOperate(c)==-1){
/*if(c=='-'){
sign=-1;
c=expression.charAt(index++);
}else if(c=='+'){
c=expression.charAt(index++);
}*/
while(c>='0'&&c<='9'){
num=num*10+c-'0';
c=expression.charAt(index++);
System.out.println("num="+num);
}
opnd.push(num);
//sign=1;
num=0;
}
if(indexOperate(c)==-1){
System.out.println("Expression is Error!");
System.exit(0);
}
switch(precede[optr.peek()][indexOperate(c)]){
case 0 :
optr.push(indexOperate(c));
c=expression.charAt(index++);
break;
case 1 :
int num2=opnd.pop();
int opt=optr.pop();
int num1=opnd.pop();
opnd.push(binaryOperation(num1,opt,num2));
System.out.println(binaryOperation(num1,opt,num2));
break;
case 2 :
optr.pop();
c=expression.charAt(index++);
break;
case 3 :
System.out.println("括号不配对Expression Error!");
System.exit(0);
}//switch
}//while
return opnd.peek();
}
int indexOperate(char c){
for(int i=0;i<operate.length;i++){
if(operate[i]==c) return i;
}
return -1;
}
int binaryOperation(int operand1,int opt,int operand2 ){
switch(opt){
case 0:
return operand1+operand2;
case 1:
return operand1-operand2;
case 2:
return operand1*operand2;
case 3:
return operand1/operand2;
}
return 0;
}
public static void main(String[] args){
//Expression e=new Expression("((((2+3)/1)+5)-2)*((9-5)/2+3)");
Expression e=new Expression("1+5");
System.out.println(e.getValueInt());
//System.out.println(e.getValueInt("(5+3)*2"));
}
}
//本程序只能计算正整数范围内的加减乘除运算。
import java.util.*;public class Expression{
//优先级数组,precede[i][j],表示第i个操作符与第j个操作符的优先级,0,1,2,3,4,5,6分别是'+', '-', '*', '/', '(', ')', '#'
//0表示,第i个操作符优先级小于第j个操作符。1表示大于,2表示相等,3是表示不可能的。
int precede[][]={{1 , 1 , 0 , 0 , 0 , 1 , 1},
{1 , 1 , 0 , 0 , 0 , 1 , 1},
{1 , 1 , 1 , 1 , 0 , 1 , 1},
{1 , 1 , 1 , 1 , 0 , 1 , 1},
{0 , 0 , 0 , 0 , 0 , 2 , 3},
{1 , 1 , 1 , 1 , 3 , 1 , 1},
{0 , 0 , 0 , 0 , 0 , 3 , 2}};
char[] operate={'+', '-', '*', '/', '(', ')', '#'};
String exp=null;
public Expression(String exp){
this.exp=exp;
}
int getValueInt(){
Stack<Integer> optr=new Stack<Integer>();
Stack<Integer> opnd=new Stack<Integer>();
String expression=exp+"#"; //给表达式加一个运算符,且是一个结束符
optr.push(6); //先把'#'操作符对应的序号入栈。
int index=0; //从0开始扫描表达式字符串。
//int sign=1; //符号,假设为正
int num=0;
char c=expression.charAt(index++);
while(c!='#'||optr.peek()!=6){
if(indexOperate(c)==-1){
/*if(c=='-'){
sign=-1;
c=expression.charAt(index++);
}else if(c=='+'){
c=expression.charAt(index++);
}*/
while(c>='0'&&c<='9'){
num=num*10+c-'0';
c=expression.charAt(index++);
}
opnd.push(num);
//sign=1;
num=0;
}
if(indexOperate(c)==-1){
System.out.println("Expression is Error!");
System.exit(0);
}
switch(precede[optr.peek()][indexOperate(c)]){
case 0 :
optr.push(indexOperate(c));
c=expression.charAt(index++);
break;
case 1 :
int num2=opnd.pop();
int opt=optr.pop();
int num1=opnd.pop();
opnd.push(binaryOperation(num1,opt,num2));
break;
case 2 :
optr.pop();
c=expression.charAt(index++);
break;
case 3 :
System.out.println("括号不配对Expression Error!");
System.exit(0);
}//switch
}//while
return opnd.peek();
}
int indexOperate(char c){
for(int i=0;i<operate.length;i++){
if(operate[i]==c) return i;
}
return -1;
}
int binaryOperation(int operand1,int opt,int operand2 ){
switch(opt){
case 0:
return operand1+operand2;
case 1:
return operand1-operand2;
case 2:
return operand1*operand2;
case 3:
return operand1/operand2;
}
return 0;
}
public static void main(String[] args){
Expression e=new Expression("((((2+3)/1)+5)-2)*((9-5)/2+3)");
//Expression e=new Expression("1+5");
System.out.println(e.getValueInt()); }
}
只是做了一些更高层次的封装,让我们直接使用。