Java表达式求解实现,用到栈先进后出的特点,详见代码
public float evaluation(String textField) {
StringBuilder str = new StringBuilder();
Stack<Float> stk = new Stack<Float>(); // 用于寄存操作数或结果
Stack<Character> stk2 = new Stack<Character>(); // 用于寄存运算符
stk2.push('#'); // 在运算符栈初始一个'#',用于第一个运算符比较优先级
char c;
// 依次读入字符
for (int i = 0; i < textField.length(); i++) {
boolean isbeg = false;// 是否为负数或正数操作符
c = textField.charAt(i);
if ((c >= '0' && c <= '9') || c == '.') { // 数字或小数点直接组合
str.append(c);
} else if (c == '+' || c == '-' || c == '*' || c == '/' || c == '('
|| c == ')') {
if ((c == '+' || c == '-') && stk.empty() && str.length() == 0) {
str.append(c);
isbeg = true;
} else if (str.length() != 0) {
try {
float f = Float.parseFloat(str.toString());
stk.push(f);
} catch (Exception e) {
flag = false;
return -1;
}
str.delete(0, str.length());
}
// 如果读入操作符优先级小于操作符栈顶元素优先级,进行计算,并将结果保存如操作数栈
if (judge(stk2.peek()) >= judge(c) && !isbeg) {
try {
float b = Float.parseFloat(stk.pop().toString());
float a = Float.parseFloat(stk.pop().toString());// 取出操作数栈两数
char c1 = stk2.pop();// 取出操作符
if (c != ')') {
stk2.push(c); // 低优先级操作符入栈
}
switch (c1) {
case '+':
stk.push(a + b);
break;
case '-':
stk.push(a - b);
break;
case '*':
stk.push(a * b);
break;
case '/':
stk.push(a / b);
break;
default:
break;
}
} catch (Exception e) {
flag = false;
return -1;
}
if (c == ')') {
while (stk2.peek() != '#') {
float b = Float.parseFloat(stk.pop().toString());
try {
float a = Float
.parseFloat(stk.pop().toString());// 取出操作数栈两数
char c1 = stk2.pop();// 取出操作符
switch (c1) {
case '+':
stk.push(a + b);
break;
case '-':
stk.push(a - b);
break;
case '*':
stk.push(a * b);
break;
case '/':
// if (b == 0) {
// 除数为零
// } else {
stk.push(a / b);
// }
break;
default:
break;
}
} catch (Exception e) {
flag = false;
return -1;
}
}
// stk2.pop();// 弹出')'
stk2.pop();// 弹出'#'
stk2.pop();// 弹出'('
}
} else if (!isbeg) {
stk2.push(c);
if (c == '(') {
stk2.push('#');
}
}
} else {
flag = false;
return -1;
}
}
// 如果 以操作数结尾,将最后一操作数入栈
if (str.length() > 0) {
try {
float f = Float.parseFloat(str.toString());
stk.push(f);
} catch (Exception e) {
flag = false;
return -1;
}
str.delete(0, str.length());
}
//最后个字符为"("
if(stk2.peek()=='#'){
flag=false;
return -1;
}
while (stk2.peek() != '#') {
try {
float b = Float.parseFloat(stk.pop().toString());
float a = Float.parseFloat(stk.pop().toString());// 取出操作数栈两数
char c1 = stk2.pop();// 取出操作符
switch (c1) {
case '+':
stk.push(a + b);
break;
case '-':
stk.push(a - b);
break;
case '*':
stk.push(a * b);
break;
case '/':
// if (b == 0) {
// 除数为零
// } else {
stk.push(a / b);
// }
break;
default:
break;
}
} catch (Exception e) {
flag = false;
return -1;
}
}
try {
return Float.parseFloat(stk.pop().toString());
} catch (Exception e) {
flag = false;
return -1;
}
}
判断运算符优先级
// 判断优先级
public static int judge(char c) {
int n = 0;
switch (c) {
case '(':
n = 3;
break;
case '+':
case '-':
n = 1;
break;
case '*':
case '/':
n = 2;
break;
case ')':
n = 0;
break;
default:
}
return n;
}
分享到:
相关推荐
有Bug可联系303447589.愿意为你解答,感谢378200809网友的提问,才有这个更新。
利用逆波兰法球表达式的值,java和c++版的,只能计算带小数点和括号
Java表达式求值、杨辉三角实验报告.pdf
java编写的表达式求值(支持小数,指数运算),第一次上传,多多指教
java中求字符串表达式的值看起来很伤脑筋,但如果你用BeanShell,一切都变得很简单。
调用该类的静态方法CalString(String s),参数为要求值的表达式,CalString(String s)将返回计算结果,或者是出错信息。 设计思路:见代码的注释文档 反馈:本程序对以上支持的内容经过大量测试,所谓“只有...
java 算术表达式求值器 java 算术表达式求值器
带反编译器,各种java算术表达式求值.包括开源的和网友开发的
Aviator是一个轻量级、高性能的Java表达式执行引擎,它动态地将表达式编译成字节码并运行。
表达式求值的源代码
此文档中的代码实现了简单的计算中缀表达式的求值方法,通过把中缀表达式转换为后缀表达式,可以很方便的进行求值。
java模拟栈实现表达式求值代码.zip可以完全实现多种功能的计算,采用了算符优先关系计算表达式的值。 注意:表达式的形式为 #表达式# 的形式,两个#号只表示表达式的开始和结束,真正的表达式在中间部分。。。。
调用该类的静态方法CalString(String s),参数为要求值的表达式,CalString(String s)将返回计算结果,或者是出错信息。 设计思路:见代码的注释文档 反馈:本程序对以上支持的内容经过大量测试,所谓“只有...
对用+、-、*、/、(、)连接起来的算术表达式求值, 可以智能识别和过滤表达式。
表达式求职的多种功能实现代码,计算功能:+ - * / ^ sin cos tan Exp Pi lg ln,带注释
掌握基于栈实现算术表达式求值的原理和算法。 使用VC++语言编写程序,根据数据结构中栈的的逻辑特性和物理存储结构,使用栈实现考虑算符优先的算术表达式求值算法,编译运行程序。
表达式求值 逆波兰表达式算法,支持任何位数值运算,运算符支持+-*/(),其它运算符请自行扩展,代码比较松耦合可扩展性好