package com.coding.basic.stack.expr; import java.util.Stack; /* * 中序表达式求值 * 1.只支持加减乘除,不支持括号 * 2.表达式中只支持int,结果可能是float * 3.用2个栈实现:一个运算符栈,一个操作数栈 */ public class InfixExpr { String expr = null; public InfixExpr(String expr) { this.expr = expr; } public float evaluate() { Stack<Character> opStack = new Stack<>(); Stack<Float> numStack = new Stack<>(); int i = 0; while(i < expr.length()){ char c = expr.charAt(i); if(isOperator(c)){ if(opStack.isEmpty()){ opStack.push(c); } else { char preOperator = opStack.peek(); if(ComparePriority(c,preOperator) > 0){ opStack.push(c); } else { float num2 = numStack.pop(); float num1 = numStack.pop(); numStack.push(calculate(opStack.pop(),num1,num2)); opStack.push(c); } } i++; } if(isNumber(c)){ String str = String.valueOf(c); i++; while(i < expr.length() && isNumber(expr.charAt(i))){ str += expr.charAt(i); i++; } numStack.push(Float.parseFloat(str)); } } while(!opStack.isEmpty()){ float num2 = numStack.pop(); float num1 = numStack.pop(); numStack.push(calculate(opStack.pop(),num1,num2)); } float result = numStack.pop(); return result; } private Float calculate(char c, float num1, float num2) { if(c == '+'){ return num1+num2; } if(c == '-'){ return num1-num2; } if(c == '*'){ return num1*num2; } if(c == '/'){ return num1/num2; } return null; } private int ComparePriority(char c, char preOperator) { if((c == '/' || c == '*')&&(preOperator == '+' || preOperator == '-')){ return 1; } return -1; } private boolean isNumber(char c) { if(c >= '0' && c <= '9'){ return true; } return false; } private boolean isOperator(char c) { if(c == '+' || c == '-' || c == '*' ||c == '/'){ return true; } return false; } }