当前位置: 代码迷 >> J2SE >> 关于一路表达式求值Acm题的求解
  详细解决方案

关于一路表达式求值Acm题的求解

热度:43   发布时间:2016-04-23 19:35:34.0
关于一道表达式求值Acm题的求解
这是原题。
现在的问题是提交后显示runtimeerror 不知道错在什么地方 有大神给看看吗
我写的java代码:

import java.text.DecimalFormat;
import java.util.Scanner;
import java.util.Stack;

public class Main {
private CharacterStack cStack;// 运算符栈
private NumberStack nStack;// 操作数栈

public void init() {// 初始化栈
cStack = new CharacterStack();
cStack.push('=');
nStack = new NumberStack();
}

public void analyse(String a) {//分析字符串,求得值
init();
String zi = new String("()+-*/=");//储存运算符
StringBuilder sb = new StringBuilder();// 暂存数字
for (int i = 0; i < a.length(); i++) {
if (isNumber(a.charAt(i))) {//如果是数字或者是.为真
sb.append(a.charAt(i) + "");
} else if (zi.contains(new String("" + a.charAt(i)))) {
if (!sb.toString().equals("")) {//暂存中不为空 压入操作数栈
nStack.push(Double.parseDouble(sb.toString()));
sb = new StringBuilder();
}
switch (compareOp(cStack.peek(), a.charAt(i))) {
case '<': // 小于 当前运算符入栈
cStack.push(a.charAt(i));
break;
case '=': // 符号栈出栈
cStack.pop();
break;
case '>': // 进行运算并将结果压入操作数栈
nStack.push(operate(nStack.pop(),
nStack.pop(), cStack.pop()));
i--;
break;
}

} else {// 表达式有误
System.out.println("" + a.charAt(i));
System.out.println("表达式有误");
}
}
}

public char compareOp(char a, char b) {//比较两个运算符的优先级
switch (a) {
case '+':
switch (b) {
case '+':
return '>';
case '-':
return '>';
case '*':
return '<';
case '/':
return '<';
case '(':
return '<';
case ')':
return '>';
case '=':
return '>';
}
break;
case '-':
switch (b) {
case '+':
return '>';
case '-':
return '>';
case '*':
return '<';
case '/':
return '<';
case '(':
return '<';
case ')':
return '>';
case '=':
return '>';
}
break;
case '*':
switch (b) {
case '+':
return '>';
case '-':
return '>';
case '*':
return '>';
case '/':
return '>';
case '(':
return '<';
case ')':
return '>';
case '=':
return '>';
}
break;
case '/':
switch (b) {
case '+':
return '>';
case '-':
return '>';
case '*':
return '>';
case '/':
return '>';
case '(':
return '<';
case ')':
return '>';
case '=':
return '>';
}
break;
case '(':
switch (b) {
case '+':
return '<';
case '-':
return '<';
case '*':
return '<';
case '/':
return '<';
case '(':
return '<';
case ')':
return '=';
case '=':
return '0';
}
break;
case ')':
switch (b) {
case '+':
return '>';
case '-':
return '>';
case '*':
return '>';
case '/':
return '>';
case '(':
return '0';
case ')':
return '>';
case '=':
return '>';
}
break;
case '=':
switch (b) {
case '+':
return '<';
case '-':
return '<';
case '*':
return '<';
case '/':
return '<';
case '(':
return '<';
case ')':
return '0';
case '=':
return '=';
}
break;
}
return '0';
}

public double operate(double a, double b, char c) {// 用运算符c操作a,b
//DecimalFormat df = new DecimalFormat("0.00");
switch (c) {
case '+':
return b+a;
case '-':
return b-a;
case '*':
return b*a;
case '/':
return b/a;
}
return 0f;
}

public boolean isNumber(char a) {// 判断是否为数字或.
if (a == '.' || a >= 48 && a <= 57)
return true;
else
return false;
}

public NumberStack getNStack() {// 返回操作数栈
return nStack;
}

public CharacterStack getCStack() {// 返回运算符栈
return cStack;
}

public static void main(String[] args) {
Main test = new Main();
DecimalFormat df = new DecimalFormat("0.00");
Scanner in = new Scanner(System.in);
int n = in.nextInt();
in.nextLine();
String[] tmp = new String[n];
for (int i = 0; i < n; i++) {
tmp[i] = in.next();
in.nextLine();
}
for (int i = 0; i < n; i++) {
test.analyse(tmp[i]);
System.out.println(df.format(Double.parseDouble((test.getNStack()
.pop() + ""))) + "");
}
}
}

class CharacterStack extends Stack<Character> {
private static final long serialVersionUID = 1L;
}

class NumberStack extends Stack<Double> {
private static final long serialVersionUID = 1L;

}

------解决思路----------------------

并没有出现问题,你在控制台写的啥 出现问题了
  相关解决方案