看了下你的代码,感觉改起来有点难度...就自己写了一个
一般整数计算,刚开始没看到有超大数...

程序代码:
import java.util.*;
class Main {
private static String[] toExpressionArray(String originalExpression) {//将原始字符串表达式分割成字符串数组,成员可能有空值
StringBuffer buf = new StringBuffer();
for(int i=0;i<originalExpression.length();i++) {
if(Character.isDigit(originalExpression.charAt(i))) {
buf.append(originalExpression.charAt(i));
} else {
buf.append(' ');
buf.append(originalExpression.charAt(i));
buf.append(' ');
}
}
return buf.toString().split(" ");
}
private static int intOP(char op) {//返回符号整数优先级
switch(op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '^':
return 3;
default:
System.out.print("operational character ERROR");
System.exit(0);
return 0;
}
}
private static int calc(char op,int num1,int num2) {//计算
switch(op) {
case '+': return num2 + num1;
case '-': return num2 - num1;
case '*': return num2 * num1;
case '/':
try {
return num2 / num1;
} catch(ArithmeticException e) {//除零
System.out.print("ERROR");
System.exit(0);
}
case '^': return (int)Math.pow(num2, num1);
default:
System.out.print("operational character ERROR");
System.exit(0);
return 0;
}
}
public static void main(String[] args) {
//读入值并分割
Scanner scan = new Scanner(System.in);
String expression = scan.nextLine();
scan.close();
String[] expressionArray = toExpressionArray(expression);
Stack<Integer> ovs = new Stack<Integer>();//数字栈
Stack<Character> optr = new Stack<Character>();//符号栈
for(String str : expressionArray) {
if(str.length()==0) continue;//空值忽略
if(Character.isDigit(str.charAt(0))) {//数字直接入数字栈
ovs.push(Integer.valueOf(str));
} else {//符号处理
char op = str.charAt(0);
if(op=='(') {//左括号,直接入栈
optr.push(op);
} else if(op==')') {//右括号,计算至左括号
while(optr.peek()!='(') {
ovs.push(calc(optr.pop(),ovs.pop(),ovs.pop()));
}
optr.pop();//弹出左括号
} else {//非括号,计算符
while(!optr.empty() && optr.peek()!='(' && intOP(op)<=intOP(optr.peek())) {//当前运算符优先级小于符号栈顶优先级,且符号栈非空非括号
ovs.push(calc(optr.pop(),ovs.pop(),ovs.pop()));//计算
}
optr.push(op);//当前符号入栈
}
}
}
while(!optr.empty()) {//清空运算
ovs.push(calc(optr.pop(),ovs.pop(),ovs.pop()));
}
System.out.print(ovs.pop());
}
}
超大数字计算。你图上的样例输入都能通过,可能还会有bug,你测试一下吧。

程序代码:
import java.math.BigInteger;
import java.util.*;
class Main {
private static String[] toExpressionArray(String originalExpression) {//将原始字符串表达式分割成字符串数组,成员可能有空值
StringBuffer buf = new StringBuffer();
for(int i=0;i<originalExpression.length();i++) {
if(Character.isDigit(originalExpression.charAt(i))) {
buf.append(originalExpression.charAt(i));
} else {
buf.append(' ');
buf.append(originalExpression.charAt(i));
buf.append(' ');
}
}
return buf.toString().split(" ");
}
private static int intOP(char op) {//返回符号整数优先级
switch(op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '^':
return 3;
default:
System.out.print("operational character ERROR");
System.exit(0);
return 0;
}
}
private static BigInteger calc(char op,BigInteger num1,BigInteger num2) {//计算
switch(op) {
case '+': return num2.add(num1);
case '-': return num2.subtract(num1);
case '*': return num2.multiply(num1);
case '/':
try {
return num2.divide(num1);//整除
} catch(ArithmeticException e) {//除零
System.out.print("ERROR");
System.exit(0);
}
case '^': return num2.pow(num1.intValue());
default:
System.out.print("operational character ERROR calc");
System.exit(0);
return null;
}
}
public static void main(String[] args) {
//读入值并分割
Scanner scan = new Scanner(System.in);
String expression = scan.nextLine();
scan.close();
String[] expressionArray = toExpressionArray(expression);
Stack<BigInteger> ovs = new Stack<BigInteger>();//数字栈
Stack<Character> optr = new Stack<Character>();//符号栈
for(String str : expressionArray) {
if(str.length()==0) continue;//空值忽略
if(Character.isDigit(str.charAt(0))) {//数字直接入数字栈
ovs.push(new BigInteger(str));
} else {//符号处理
char op = str.charAt(0);
if(op=='(') {//左括号,直接入栈
optr.push(op);
} else if(op==')') {//右括号,计算至左括号
while(optr.peek()!='(') {
ovs.push(calc(optr.pop(),ovs.pop(),ovs.pop()));
}
optr.pop();//弹出左括号
} else {//非括号,计算符
while(!optr.empty() && optr.peek()!='(' && intOP(op)<=intOP(optr.peek())) {//当前运算符优先级小于符号栈顶优先级,且符号栈非空非括号
ovs.push(calc(optr.pop(),ovs.pop(),ovs.pop()));//计算
}
optr.push(op);//当前符号入栈
}
}
}
while(!optr.empty()) {//清空运算
ovs.push(calc(optr.pop(),ovs.pop(),ovs.pop()));
}
System.out.print(ovs.pop());
}
}