请问用一个String变量接受一个算式,然后有什么方法能计算这个算式的结果吗?
    比如:用一个String型变量接受了一个算式--2+3*4,怎么求其值啊?    最近在写个输入四个数字计算24点的小程序,想用三个4次的循环来代替四个数字中间的三个运算符,如:for( int i=1; i<=4; i++ ), 当等于1时,运算符为+,当i=2时,运算符为-,然后用string类型的变量接收类似“2+3*4”的算式,再求其值是否等于24,Integer.parseInt不行,因为“2+3*4”是一个字符串......
    目前得到两种提示:一种是在java中使用JAVASCRIPT,另一种是貌似很难,将原字符串转换成后缀表达式,再以二叉树的形式保存!最后就开始计算结果,本人系初学者,以上两种方法涉及到的知识都没学到... 
    所以有三个问题请教大家:
    1、大家认为我得到的两种提示,那一种方法实现起来相对容易一点,简单一点,适合初学者使用
    2、关于这个“后缀表达式”,我粗略的看了一下,像“2+3*4”这样的算式貌似转换成后缀表达式之后是从左到右计算的,即(2+3)*4,而不是先计算3*4,在计算2+12,是这样的吗?
    3、关于这个计算24点的小程序,大家有什么好的实现方法吗?

解决方案 »

  1.   

    附件上传失败?
    下面是自己写的算24点的小程序,经测试,发现得出的答案不全
    //算4个数 通过加减乘除 结果为24 列举每种情况统计...    得用double型的变量存储数据import javax.swing.*;
    public class Test24
    {
         public static void main( String args[] )
         {
              int count = 0;
              String out = "";
              double num1 = 1;
              double num2 = 1;
              double num3 = 1;
              double num4 = 1;          try
              {
                   num1 = Double.parseDouble( JOptionPane.showInputDialog( "Please enter the first integer!" ) ); 
                   num2 = Double.parseDouble( JOptionPane.showInputDialog( "Please enter the second integer!" ) ); 
                   num3 = Double.parseDouble( JOptionPane.showInputDialog( "Please enter the third integer!" ) ); 
                   num4 = Double.parseDouble( JOptionPane.showInputDialog( "Please enter the fourth integer!" ) ); 
              }          catch ( NumberFormatException numberFormatException ) {
                    JOptionPane.showMessageDialog( null, "You must enter an integer", "Invalid Number Format", JOptionPane.ERROR_MESSAGE );
                    System.exit( 0 );
              }
              
              for ( int i=1; i<=4; i++ )
              {
                    double tmp1 = jiSuan( i, num1, num2 );     
      
                    for ( int j=1; j<=4; j++ )
                    {
                          double tmp2 = jiSuan( j, tmp1, num3 ); 
                          
                          for ( int k=1; k<=4; k++ )
                          {
                               double tmp3 = jiSuan( k, tmp2, num4 ); 
                               
                               if ( tmp3 == 24 )
                               {    count++;
                                    out += "第" + count + "个解法:((" + ( int )num1 + getSign( i ) + ( int )num2 + ")" + getSign( j ) + ( int )num3 + ")" + getSign( k ) + ( int )num4 + "= 24\n";
                               }
                          }
                    }
              }
              String outPut = "";
              if ( count == 0 )  
              {
                    outPut += "对不起," + ( int )num1 + " " + ( int )num2 + " " + ( int )num3 + " " + ( int )num4 + " 算24点无解......";        
              }
              else
              {
                    outPut += "总共" + count +"种解法,它们是:\n" + out;
              }          JOptionPane.showMessageDialog( null, outPut, "Result", JOptionPane.PLAIN_MESSAGE );
              System.exit( 0 );
         }          public static double jiSuan( int a, double b, double c )
              {
                    double number = 0;
                    switch ( a )
                    {
                          case 1:
                          number = b + c;
                          break;                      case 2:
                          number = b - c;
                          break;                      case 3:
                          number = b * c;
                          break;                      case 4:
                          number = b / c;
                          break;
                    }
                    return number;
              }          public static String getSign( int a )
              {
                    String sign = "";
                    switch ( a )
                    {
                          case 1:
                          sign = "+";
                          break;                      case 2:
                          sign = "-";
                          break;                      case 3:
                          sign = "×";
                          break;                      case 4:
                          sign = "÷";
                          break;
                    }
                    return sign;
              }
      

  2.   

    如果我做的话会对“2+3*4”进行拆串。记住运算符的出现顺序,然后把数字变成int型。然后把运算符加进去重新组合然后可运算。方法比较笨。但是我觉得一定能实现。如果有其他好的方法原因学习。
      

  3.   

    jeval介绍:
    http://www.javaread.com/topic/show/18网站:
    http://jeval.sourceforge.net/