数据结构实验-栈的应用算术表达式的求值

第一步;定义异常类

第二步;实现栈的算法和步骤

具体步骤为————//初始化表达式      //定义运算数栈        //定义运算符栈       //OPTR初始化为定界符            //两栈栈顶初始化       //依次读取表达式字符       //字符就在字符栈处处理,比较当前与栈顶运算符的优先级        //当前运算符优先级高,运算符入栈(当前运算符优先级低,运算数出栈)      //根据运算符类型运算      //运算结果入栈          //返回栈顶运算结果.最终得出结果

        第三步;输出结果

本题计算式子为(4+2)*3-5

结果为13

步骤如图所示

最终输出结果为13

 程序代码

 class BiaodashiException extends RuntimeException {
    private static final long serialVersionUID = 1L;
    public BiaodashiException() {}
    public BiaodashiException(String message) {
        super(message);
    }
}
 class Biaodashi {
    private String expr;
    public Biaodashi(String expr) {
        this.expr = expr;
    }
    public int compute() {
        char[] OPND = new char[10];
        char[] OPTR = new char[10];
        OPTR[0] = '#';
        int top1 = -1, top2 = 0;
        char[] chars = expr.toCharArray();
        for (int i = 0; i < chars.length; ) {
            int grade, num1, num2, oper, result = 0;
            if (chars[i] >= 48 && chars[i] <= 57) {
                OPND[++top1] = (char)(chars[i++]-48);
            } else {
                grade = comp(chars[i], OPTR[top2]);
                if (grade == 1) {
                    OPTR[++top2] = chars[i++];
                } else if (grade == -1) {
                    num2 = OPND[top1--];
                    num1 = OPND[top1--];
                    oper = OPTR[top2--];
                    switch (oper) {
                        case '+':
                            result = num1 + num2;
                            break;
                        case '-':
                            result = num1 - num2;
                            break;
                        case '*':
                            result = num1 * num2;
                            break;
                        case '/':
                            result = num1 / num2;
                            break;
                        default:
                            break;
                    }
                    OPND[++top1] = (char)result;
                } else {
                    top2--;
                    i++;
                }
            }
        }
        return OPND[top1];
    }
    private int comp(char oper1, char oper2) {
        switch (oper1) {
            case '+':
            case '-':
                if (oper2 == '(' || oper2 == '#') {
                    return 1;
                } else {
                    return -1;
                }
            case '*':
            case '/':
                if (oper2 == '*' || oper2 == '/') {
                    return -1;
                } else {
                    return 1;
                }
            case '(':
                return 1;
            case ')':
                if (oper2 == '(') {
                    return 0;
                } else {
                    return -1;
                }
            case '#':
                if (oper2 == '#') {
                    return 0;
                } else {
                    return -1;
                }
            default:
                throw new BiaodashiException("符号无法识别");
        }
    }
}
public class BiaodashiTester {
    public static void main(String[] args) {
        Biaodashi Biaodashi = new Biaodashi("(4+2)*3-5#");
        int result = Biaodashi.compute();
        System.out.println("表达式结果:" + result);
    }
}

猜你喜欢

转载自blog.csdn.net/m0_54570435/article/details/130399687