写了个简单的中缀表达式求值,一直调不过,麻烦各位大侠帮忙指正,代码如下目标输入:(1+2)* 3 + (5/1)
目标输出: 14package simplecomputer;import java.util.Scanner;
import java.util.Stack;public class Caculator
{
public String compute(String expression)
{
String exp = expression.trim();
char[] strs = exp.toCharArray(); Stack<String> operatorStack = new Stack<String>();
Stack<String> valueStack = new Stack<String>(); String topOperator = "";
String operandOne = "";
String operandTwo = "";

Double result = new Double(0.0); for (int i = 0; i < strs.length; i++)
{
String pointer = String.valueOf(strs[i]);
Character next = new Character(pointer.charAt(0)); switch (next)
{
case '+':case '-':case '*':case '/':
if(operatorStack.isEmpty())
{
operatorStack.push(pointer);
}
else
{
topOperator = operatorStack.peek();
Character a = topOperator.charAt(0);
while (priority(next) <= priority(a))
{
                                              topOperator = operatorStack.pop();
operandTwo = valueStack.pop();
operandOne = valueStack.pop();
Double num1 = Double.parseDouble(operandOne);
Double num2 = Double.parseDouble(operandTwo);
result = calculate(topOperator,num1, num2);
valueStack.push(result.toString());
}
operatorStack.push(pointer);
}
                                     break;
                
case '(':
operatorStack.push(pointer);
break; case ')':
topOperator = operatorStack.pop();
while(topOperator != "(")
{
operandTwo = valueStack.pop();
operandOne = valueStack.pop();
Double num1 = Double.parseDouble(operandOne);
Double num2 = Double.parseDouble(operandTwo);
result = calculate(topOperator,num1, num2);
valueStack.push(result.toString());

topOperator = operatorStack.pop();
}
break;
default:
if (Character.isDigit(next))
{
     valueStack.push(pointer);
 }
else
{
System.out.println("表达式输入错误");
}
    break;
}
} while (!operatorStack.isEmpty())
{
System.out.println(valueStack);
System.out.println(operatorStack);

topOperator = operatorStack.pop();
operandTwo = valueStack.pop();
operandOne = valueStack.pop();
Double num1 = Double.parseDouble(operandOne);
Double num2 = Double.parseDouble(operandTwo);
result = calculate(topOperator,num1, num2);
valueStack.push(result.toString());
}


return valueStack.peek();
}

private int priority(Character op)                  //计算运算符优先级
{
Character add = new Character('+');
Character reduce = new Character('-');
Character minus = new Character('*');
Character dive = new Character('/');

if( (op.equals(add))||(op.equals(reduce)) )
{
return 1;
}
else if ( (op.equals(minus))||(op.equals(dive)) )
{
return 2;
}
else
{
return 0;
}
} public Double calculate(String op, Double num1, Double num2)
{
if ("+".equals(op))
{
return num1 + num2;
}
if ("-".equals(op))
{
return num1 - num2;
}
if ("*".equals(op))
{
return num1 * num2;
}
if ("/".equals(op))
{
if (num2.equals(0.0))
{
System.out.println("Error");
}
else
{
return num1 / num2;
}
}
return null;
} public static void main(String arg[])
{
String expression = "";
System.out.println("输入计算表达式:");
Scanner temp = new Scanner(System.in);
expression = temp.next();
System.out.println(expression);

Caculator b = new Caculator();
String res = b.compute(expression);
System.out.println("计算结果是:" + res);
}
}

解决方案 »

  1.   

    Java虽然可以java虽然可以在不同手机上运行,但是效率很低,还不如不同平台针对性开发
    java虽然可以跨平台,一般都是一次编译,到处异常,不断调试
    java jdk升级太慢,不能提供给开发人员高效开发支撑,String.isNullOrEmpty;String.isNullOrWhiteSpace有么
    java ide(myeclipse,netbean)提供的智能提示,调试等功能也不足以提供给开发人员高效开发和调试
    java jdk代码运行效率完全不能和.net相提并论,比如泛型,键值对搜索
      

  2.   

    myeclipse调一下就可以了
      

  3.   

    jdk1.4环境下调通过  请问楼主哪调不过 报什么错 描述清楚好不 浪费大家时间 请原谅我说话就这么直
    import java.util.Scanner;
    import java.util.Stack;public class Caculator {
    public String compute(String expression) {
    String exp = expression.trim();
    char[] strs = exp.toCharArray(); Stack operatorStack = new Stack();
    Stack valueStack = new Stack(); String topOperator = "";
    String operandOne = "";
    String operandTwo = ""; double result = 0.0; for (int i = 0; i < strs.length; i++) {
    String pointer = String.valueOf(strs[i]);
    Character next = new Character(pointer.charAt(0)); switch (next.charValue()) {
    case '+':
    case '-':
    case '*':
    case '/':
    if (operatorStack.isEmpty()) {
    operatorStack.push(pointer);
    } else {
    topOperator = operatorStack.peek().toString();
    Character a = new Character(topOperator.charAt(0));
    while (priority(next) <= priority(a)) {
    topOperator = operatorStack.pop().toString();
    operandTwo = valueStack.pop().toString();
    operandOne = valueStack.pop().toString();
    Double num1 = Double.valueOf(operandOne);
    Double num2 = Double.valueOf(operandTwo);
    result = calculate(topOperator, num1, num2);
    valueStack.push(String.valueOf(result));
    }
    operatorStack.push(pointer);
    }
    break; case '(':
    operatorStack.push(pointer);
    break; case ')':
    topOperator = operatorStack.pop().toString();
    while (topOperator != "(") {
    operandTwo = valueStack.pop().toString();
    operandOne = valueStack.pop().toString();
    Double num1 = Double.valueOf(operandOne);
    Double num2 = Double.valueOf(operandTwo);
    result = calculate(topOperator, num1, num2);
    valueStack.push(String.valueOf(result)); topOperator = operatorStack.pop().toString();
    }
    break;
    default:
    if (Character.isDigit(next.charValue())) {
    valueStack.push(pointer);
    } else {
    System.out.println("表达式输入错误");
    }
    break;
    }
    } while (!operatorStack.isEmpty()) {
    System.out.println(valueStack);
    System.out.println(operatorStack); topOperator = operatorStack.pop().toString();
    operandTwo = valueStack.pop().toString();
    operandOne = valueStack.pop().toString();
    Double num1 = Double.valueOf(operandOne);
    Double num2 = Double.valueOf(operandTwo);
    result = calculate(topOperator, num1, num2);
    valueStack.push(String.valueOf(result));
    } return valueStack.peek().toString();
    } private int priority(Character op) // 计算运算符优先级
    {
    Character add = new Character('+');
    Character reduce = new Character('-');
    Character minus = new Character('*');
    Character dive = new Character('/'); if ((op.equals(add)) || (op.equals(reduce))) {
    return 1;
    } else if ((op.equals(minus)) || (op.equals(dive))) {
    return 2;
    } else {
    return 0;
    }
    } public double calculate(String op, Double num1, Double num2) {
    if ("+".equals(op)) {
    return num1 .doubleValue()+ num2.doubleValue();
    }
    if ("-".equals(op)) {
    return num1.doubleValue() - num2.doubleValue();
    }
    if ("*".equals(op)) {
    return num1.doubleValue() * num2.doubleValue();
    }
    if ("/".equals(op)) {
    if (num2.equals(new Double(0.0))) {
    System.out.println("Error");
    } else {
    return num1.doubleValue() / num2.doubleValue();
    }
    }
    return 0;
    } public static void main(String arg[]) {
    String expression = "";
    System.out.println("输入计算表达式:");
    Scanner temp = new Scanner(System.in);
    expression = temp.next();
    System.out.println(expression); Caculator b = new Caculator();
    String res = b.compute(expression);
    System.out.println("计算结果是:" + res);
    }
    }
      

  4.   

    我用的jdk1.5输入计算表达式:
    (1+2)* 3 + (5/1)
    (1+2)*
    Exception in thread "main" java.util.EmptyStackException
    at java.util.Stack.peek(Stack.java:79)
    at java.util.Stack.pop(Stack.java:61)
    at simplecomputer.Caculator.compute(Caculator.java:91)
    at simplecomputer.Caculator.main(Caculator.java:161)
    表达式输入错误
    表达式输入错误
    [1, 2]
    [+, *]
    [2.0]
    [+]