java简单实现直接运算表达式

package com.cai.math;

import java.util.Stack;

/**
 * 目标:java实现直接算出中缀表达式:例:3+2*5-6的值
 * 思路:1.分别把数字,和符号放入两个栈中
 *      2.如果是数字:直接入数字栈
 *      3.如果是符号,当前符号的优先级别小于等于上一个符号,数字栈pop两个值,符号栈pop出一个符号运算,值放入数字栈,当前符号入符号栈
 *                  当前符号的优先级大于上一个符号,符号直接入符号栈
 *      4.一次取出数字栈的值,符号栈的符号,依次运算,值入数字栈
 *      5.知道数字栈中只有一个值(或者符号栈为空)结束,取出数字栈的当前值为最终结果
 */
public class ExpressionTest {
    public static void main(String[] args) {
        String expression = "13+2*5-6"; //这里给正确的表达式,先不做检验表达式正确与否
        Stack<String> operateStack = new Stack<String>();//操作法栈
        Stack<Integer> numStack = new Stack<Integer>();//数字栈
        //开始取表达式
        String currentChar = "";
        for (int i = 0; i < expression.length(); i++) {
            String index = expression.substring(i,i+1);

            boolean flag = isNum(index);
            if(flag){
                boolean lastNum = isNum(currentChar);
                if(lastNum&&!numStack.empty()){
                    Integer lastValue = numStack.pop();
                    index = String.valueOf(lastValue)+index;
                }
                numStack.push(Integer.valueOf(index));
            }else{
                if(!operateStack.empty()){
                    int thisOperate = priorityLevel(index);
                    int lastOperate = priorityLevel(operateStack.peek());
                    if(thisOperate<=lastOperate){
                        Integer num1 = numStack.pop();
                        Integer num2 = numStack.pop();
                        String operate = operateStack.pop();
                        Integer thisResult = getResult(operate,num1,num2);
                        numStack.push(thisResult);
                    }
                }
                operateStack.push(index);
            }
            currentChar = index;
        }
        while (!operateStack.empty()){
            Integer num1 = numStack.pop();
            Integer num2 = numStack.pop();
            String operate = operateStack.pop();
            Integer thisResult = getResult(operate,num1,num2);
            numStack.push(thisResult);
        }
        System.out.println(expression+"="+numStack.pop());

    }

    /**
     *
     * @param operate 运算符
     * @param num1  第一个pop的数字
     * @param num2  第二个pop的数字
     * @return 运算结果
     */
    public static  Integer getResult(String operate,Integer num1,Integer num2){
        Integer result = 0;
        if("+".equals(operate)){
            result=num2+num1;
        }else if("-".equals(operate)){
            result=num2-num1;
        }else if("*".equals(operate)){
            result=num2*num1;
        }else if("/".equals(operate)){
            result=num2/num1;
        }
        return result;
    }

    /**
     * @param operate 操作符
     * @return 优先级别(暂时只支持‘+,-,*,/’),数值越大,优先级别越高
     */
    public static  int priorityLevel(String operate){
        int result = -1;
        if("+".equals(operate)||"-".equals(operate)) result=0;
        else if("*".equals(operate)||"/".equals(operate)) result=1;
        else  result=-1;
        return result;
    }

    /**
     * 判断当前字符是否是数字 是 true 否 false
     * @param chart 当前字符
     * @return
     */
    public static boolean isNum(String chart){
        if("+".equals(chart)||"-".equals(chart)||"*".equals(chart)||"/".equals(chart)) return false;
        return true;
    }
}
原文地址:https://www.cnblogs.com/cai170221/p/13679198.html