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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM