1. 程式人生 > 實用技巧 >java簡單實現直接運算表示式

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