【Java】栈实现表达式求值

混江龙づ霸主 提交于 2020-02-26 22:06:26

示例:3 + 4 * 3 + ( 5 - 1) #

借鉴博客: https://blog.csdn.net/qq_20009015/article/details/83870474

解题思路:

  1. 本题的难度在于如何区分优先级实现四则运算
  2. 首先定义两个栈:操作数栈用来存储操作数,操作符栈用来存储操作符
  3. 表达式的求值关键点在于运算符号的优先级,当当前符号的优先级大于栈顶的符号时,直接入栈;若当前符号小于栈顶,则计算当前操作数栈顶的两个元素;若等于,则栈顶符号出栈
  4. 优先级的定义看代码

代码:

package practise;

import java.io.IOException;
import java.util.Stack;


public class EvaluateExpression {

    // 定义两个栈
    private static Stack<Character> stackOpr = new Stack<>();
    private static Stack<Integer> stackNum = new Stack<>();

    // 计算表达式
    public static void main(String [] args) throws IOException {
        char c = (char)System.in.read();
        stackOpr.push('#');

        while(c != '#' || stackOpr.peek() != '#'){
            if(isNum(c)){
                stackNum.push(c - 48);
                c = (char)System.in.read();
            }else{
                switch(isPrior(c)){
                    case '<':
                        int a = stackNum.pop();
                        int b = stackNum.pop();
                        stackNum.push(operation(b, a, stackOpr.pop()));
                        break;
                    case '>':
                        stackOpr.push(c);
                        c = (char)System.in.read();
                        break;
                    case '=':
                        stackOpr.pop();
                        c = (char)System.in.read();
                        break;
                }
            }
        }
        System.out.println(stackNum.pop());
    }


    // 判断字符的优先级
    static char isPrior(char c){
        char c1 = stackOpr.peek();
        if(c == '+' || c == '-'){
            if(c1 == '+' || c1 == '-' || c1 == '*' || c1 == '/' || c1 == ')')
                return '<';
            if(c1 == '(' || c1 == '#')
                return '>';
        }

        if(c == '*' || c == '/'){
            if(c1 == '*' || c1 == '/' || c1 == ')')
                return '<';

            if(c1 == '+' || c1 == '-' || c1 == '#' || c1 == '(')
                return '>';
        }

        if(c == '('){
            return '>';
        }

        if(c == ')'){
            if(c1 == '(')
                return '=';
            else
                return '<';
        }

        if(c == '#'){
            if(c1 == '#')
                return '=';
            else
                return '<';
        }
        return 0;
    }


    // 计算当前表达式
    static int operation(int a, int b, char c){
        switch(c){
            case '+':
                return a + b;
            case '-':
                return a - b;
            case '*':
                return a * b;
            case '/':
                return a / b;
        }
        return 0;
    }

    // 判断是否为数字
    static boolean isNum(char c){
        if(c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c =='#'){
            return false;
        }
        return true;
    }

}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!