写了个简单的中缀表达式求值,一直调不过,麻烦各位大侠帮忙指正,代码如下目标输入:(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);
}
}
java虽然可以跨平台,一般都是一次编译,到处异常,不断调试
java jdk升级太慢,不能提供给开发人员高效开发支撑,String.isNullOrEmpty;String.isNullOrWhiteSpace有么
java ide(myeclipse,netbean)提供的智能提示,调试等功能也不足以提供给开发人员高效开发和调试
java jdk代码运行效率完全不能和.net相提并论,比如泛型,键值对搜索
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);
}
}
(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]
[+]