java写组求值_用栈来实现表达式求值【Java版】

//String s="-3*(244+22/87/(2^3*57))";

String s="-3*  (-5  *  (-2)+23  4+22  /  87 /  (2^3*  57))"; //我测试负号,用这个,值跟上面的一样

求值System.out.println(evaluate(s));

//结果 -732.0016636418633

==========================

之前在百度搜了一个c语言版的,结果发现不是很能正常运行,看了几遍,实在是没看出为啥偶尔运行成功,偶尔运行不成功。。。于是自己动手,按照那思路写了版java的。。。

不过c和java版的差别蛮大的,

c语言字符串逐字处理,直接char *s指针后移s++就行了,java得用下标i去控制。。。

另外我是为了方便,直接用的现成的java.util.Stack,没有自己去构造栈。。。

=========================

代码如下:

import java.util.Stack; /* 所使用的java内部类说明 java.util.Stack栈类,三个方法  push压栈, pop出栈, peek取栈顶的值 String类,方法 indexOf查子串位置(查不到返回-1),length串长度, charAt某位置的字符值, replaceAll字符串替换 StringBuffer类,可变字符串类,可以随时追加长度append,删除delete  */ public class EvaluateExpression { public static void main(String[] args)  { //String s="-3*(244+22/87/(2^3*57))"; String s="-3*  (-5  *  (-2)+23  4+22  /  87 /  (2^3*  57))"; //我测试负号,用这个,值跟上面的一样 System.out.println(evaluate(s)); //结果 -732.0016636418633 } public static double operate(double a,  char oper, double b) //计算函数Operate   {      switch(oper)     {      case '+': return a+b;       case '-': return a-b;       case '*': return a*b;       case '/': return a/b;       case '^': return Math.pow(a,b);       default : return 0;       }    } public static boolean isOperators(char ch) { //若ch为运算符则返回true,否则返回false return  "+-*/()#^".indexOf(ch) != -1;  //查找不到,表示不是运算符 } public static char precede(char Aop, char Bop) { char prior[][] =   { // 运算符优先级表     // '+' '-' '*' '/' '(' ')' '#' '^'       {'>','>','','>','','>','','>','','>','>','>','','>','','>','>','>','','>','','>','>','>',' ','>','>','>'},    /* ')' */    {'','>','>','>','','>','>'}     /* '^' */    };    int A_index="+-*/()#^".indexOf(Aop); int B_index="+-*/()#^".indexOf(Bop); return prior[A_index][B_index]; } public static double evaluate(String myExpression) { myExpression=myExpression.replaceAll("\\s*", ""); //先去除字符串中所有空白 //System.out.println(myExpression); Stack OPTR = new Stack();//运算符栈 Stack OPND = new Stack();//数据栈 OPTR.push('#'); StringBuffer tempdata=new StringBuffer();//临时操作数 int i=0; int len=myExpression.length(); //增加负号处理。两种情况:如果表达式开头的-1 一定是负号;跟着左括号后的-是负号;,,其余是减号 //处理方式,在负号之前数据栈压入0,然后负号也就当减号处理了 if( myExpression.charAt(i)=='-' ) { //目前i=0,判断首位是不是负号 OPND.push(0.0);   OPTR.push('-'); i++; } //  while( i': // 退栈并将运算结果入栈                   char cop=OPTR.pop();                   double b=OPND.pop();                double a=OPND.pop();                OPND.push(operate(a, cop, b));                break;               } //switch          }  //if (!isOperators(c))  else   }//while while(OPTR.peek()!='#') {             char cop=OPTR.pop();                double b=OPND.pop();             double a=OPND.pop();             OPND.push(operate(a, cop, b)); } return OPND.peek();    } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值