package com.coding.basic.stack.expr; import java.util.Stack; public class MyInfixExpr { //操作数为整数,操作符只支持+、-、*、/,/的返回值为float类型 private String expr = ""; private char[] sc = null; private int pos = 0; public MyInfixExpr(String expr) { this.expr = expr; this.sc = expr.toCharArray(); } //下一个操作数 private int nextOperand(){ int result = sc[pos] - 48;//char:'0'-->int:0 pos++; while(pos < sc.length && sc[pos] >= '0' && sc[pos] <= '9'){ result = result * 10 + (sc[pos] - 48); pos++; } return result; } //下一个操作符 private char nextOperator(){ return sc[pos++]; } public float evaluate() { Stack<Number> stack = this.multiplyDivide(); float result = add(stack); return result; } //将栈内所有操作数相加 private float add(Stack<Number> stack){ if(stack == null || stack.isEmpty()){ return 0; } float result = 0; while(!stack.isEmpty()){ result = result + (float)stack.pop(); } return result; } //操作数入栈,完成乘除运算,'-'随数入栈 private Stack<Number> multiplyDivide(){ Stack<Number> operandStack = new Stack<Number>(); operandStack.push((float)this.nextOperand()); int tempOperand = 0; char tempOperator = 0; while(pos < sc.length){ tempOperator = this.nextOperator(); tempOperand = this.nextOperand(); if(tempOperator == '+'){ operandStack.push((float)tempOperand); }else if(tempOperator == '-'){ operandStack.push((float)(- tempOperand)); }else if(tempOperator == '*'){ float top = (float)operandStack.pop(); operandStack.push(top * tempOperand); }else if(tempOperator == '/'){ float top = (float)operandStack.pop(); operandStack.push(top / tempOperand); } } return operandStack; } }