字符映射计算

lk198186 2009-07-03 05:59:36
String str="((((2+3)/1)+5)-2)*((9-5)/2+3)";
如何计算得到((((2+3)/1)+5)-2)*((9-5)/2+3)的值?
就是将字符串解析后计算出对应的数值
...全文
64 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
要么自己通过堆栈、逆波兰式等自己实现,要么就使用动态语言工具。

比如说:JDK 6 中 JavaScript、开源的 BeanShell 等的 eval 函数,当然了这些函数的实现也是通过编译原理实现的,
只是做了一些更高层次的封装,让我们直接使用。
bigbug9002 2009-07-03
  • 打赏
  • 举报
回复
重贴一次,把我调试的一些语句去掉:
//本程序只能计算正整数范围内的加减乘除运算。
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());

}
}
bigbug9002 2009-07-03
  • 打赏
  • 举报
回复
我自己写了一个,只能算非负整数的程序。由于不能实现负数,注释也没有什么意思了。抛砖看看能不能引来玉:
//本程序只能计算正整数范围内的加减乘除运算。
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"));
}
}
bigbug9002 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 laorer 的回复:]
一个栈的应用的例子
[/Quote]
是啊

自己写一个也不难.

laorer 2009-07-03
  • 打赏
  • 举报
回复
一个栈的应用的例子
xnjnmn 2009-07-03
  • 打赏
  • 举报
回复
代码太长了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")));

}
bigbug9002 2009-07-03
  • 打赏
  • 举报
回复
如果只有+-*/()还是好解决的.有相关算法

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧