数据结构-Stack:施用栈来实现一个简易的算术表达式计算器
数据结构-Stack:使用栈来实现一个简易的算术表达式计算器
package org.cgz.practice; import java.util.Stack; import java.util.StringTokenizer; class Caculator { /** * 计算算术表达式的结果 * @param expression 表达式字符串 * @return */ public static double caculate(String expression) { //存储操作数的栈 Stack<Double> operandStack = new Stack<Double>(); //存储操作符的栈 Stack<Character> operatorStack = new Stack<Character>(); //拆分表达式 StringTokenizer tokens = new StringTokenizer(expression, "()+-/*", true); while(tokens.hasMoreTokens()) { String token = tokens.nextToken().trim(); if(token.length()==0) { continue; }else if(token.charAt(0)=='+' || token.charAt(0)=='-') { //+或-的优先级比较低,因此需要计算前面所有的表达式 while(!operatorStack.isEmpty() && (operatorStack.peek()=='+' || operatorStack.peek()=='-' || operatorStack.peek()=='*' || operatorStack.peek()=='/')) { processAnOperator(operandStack,operatorStack); } operatorStack.push(token.charAt(0)); }else if(token.charAt(0)=='*' || token.charAt(0)=='/') { //*或/优先级较高,需要看下一个操作符才能进行计算 operatorStack.push(token.charAt(0)); }else if(token.trim().charAt(0)=='(') { operatorStack.push('('); }else if(token.trim().charAt(0) == ')') { //计算()中的表达式的值 while(operatorStack.peek() != '(') { processAnOperator(operandStack,operatorStack); } //弹出'(' operatorStack.pop(); }else { //将操作数入栈 operandStack.push(new Double(token)); } } //计算剩下的表达式的结果 while(!operatorStack.isEmpty()) { processAnOperator(operandStack, operatorStack); } //返回最后的结果 return operandStack.pop(); } /** * 取出栈中的操作数和操作符 进行计算,并将结果push到operandStack * @param operandStack * @param operatorStack */ private static void processAnOperator(Stack<Double> operandStack,Stack<Character> operatorStack) { char op = operatorStack.pop(); double op1 = operandStack.pop(); double op2 = operandStack.pop(); if(op=='+') { operandStack.push(op2+op1); }else if(op=='-') { operandStack.push(op2-op1); }else if(op=='*') { operandStack.push(op2*op1); }else if(op=='/') { operandStack.push(op2/op1); } } } public class CaculatorTest { public static void main(String[] args) { System.out.println(Caculator.caculate("3+2*(5+6/2)")); } }
计算结果:
19.0