读书人

数据结构-Stack:施用栈来实现一个简易

发布时间: 2013-07-04 11:45:28 作者: rapoo

数据结构-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

读书人网 >编程

热点推荐