一.处理的对象
算术表达式(Arithmetical Expression):一个任意给定的由+、-、*、/、(、)以及阿拉伯数字组成的字符串,把"0.123456789"还有负号作为操作数,把"(+-*/)"作为操作符。例如:(12.89+(-9))*2.65/(-3)。
二.处理的方法
1.定义两个栈,一个操作符(operator)栈,一个操作数(operand)栈。
2.判断表达式是否合法,合法进入3,否则进入4。
①字符合法性检验,每个字符必须是算术表达式中要求的字符;
②括号匹配检验,包括个数是否匹配,以及位置是否正确合法。
"("前不能有操作数,后不能有操作符;")"前不能有操作符,后不能有操作数。
③小数点合法性检验,其前其后都要有数字。
④操作符合法性检验,操作符两边要有操作数。
⑤区分"-"是操作数中的负号还是操作符中的减号。
3.解析表达式并运算。
①遇到操作符确定不是负号,从上一个操作符位置开始截取字符串,把结果转换成double型数据,放入操作数栈;
②遇到操作符。
如果是"+-",从操作数栈中取出两个操作数,从操作符栈中取出一个操作符做运算,把运算的结果放入操作数栈中,同时把当前遇到的操作符放入操作符栈中。
如果是"*/",判断操作符中的最后一个操作符,如果是"*/",从操作数栈中取出两个操作数,从操作符栈中取出一个操作符做运算,把运算的结果放入操作数栈中,同时把当前遇到的操作符放入操作符栈中;如果是"+-",把当前操作符放入操作符栈中。
③对于一个含有括号的算术表达式,只需从最内层括号部分开始次做②的运算,直到操作符栈空结束。
4.得到结果信息,处理完毕。
三.JAVA实现
- package ttwork.expression;
- import java.util.Stack;
- public class ArithExpression {
- private String expression; //定义算术表达式的域
- private String errorMessage; //定义错误信息域
- private String result = "0"; //定义表达式的结果
- public ArithExpression() {
- expression = null;
- errorMessage = null;
- }
- public ArithExpression(String str) {
- expression = str;
- }
- public boolean isDigit(char ch) { //判断表达式中的字符是否为数字?
- String digits = "0123456789";
- if(digits.indexOf(ch) == -1) {
- return false;
- } else {
- return true;
- }
- }
- public boolean isOperator(char ch) { //判断表达式中的字符是否为操作符?
- String operators = "+-*/";
- if(operators.indexOf(ch) == -1) {
- return false;
- } else {
- return true;
- }
- }
- public boolean isParenthese(char ch