164.Basic Calculator II

来源:互联网 发布:windows phone qq在线 编辑:程序博客网 时间:2024/06/04 18:11

Implement a basic calculator to evaluate a simple expression string.

The expression string contains only non-negative integers, +-*/ operators and empty spaces . The integer division should truncate toward zero.

You may assume that the given expression is always valid.

Some examples:

"3+2*2" = 7" 3/2 " = 1" 3+5 / 2 " = 5

Note: Do not use the eval built-in library function.

计算表达式的值。 
 Step1:把字符串s按照()+-进行分割成字符串数组; 
 Step2:新建一个stack存放目前计算的值;
 Step3:依次遍历字符串数组中的每个字符串;如果遇到的是*或/则先把其左右两边操作数计算之后再入栈。 
 Step4:把栈内的元素进行运算。

 第三步相当于去括号并且如果遇到了*和/则先把其左右操作数的计算结果得到之后再入栈,第四步计算去掉括号之后的值。

/** * 计算表达式的值。  * 题目中指出表达式中并没有括号,所以可以暂时不用考虑括号的问题。 * 只需要在遍历过程中如果遇到了*和/则先计算即可。 */public int calculate(String s) {Stack stack = new Stack<String>();ArrayList<String> list = new ArrayList<String>();int sLen = s.length();int index = 0;StringBuilder sb;/*查分字符串为数字和括号+-,比如1 + 1拆分为1,+,1*/while(index<sLen){char c = s.charAt(index);/*如果遇到的是空格,则忽略*/if(c == ' '){index++;continue;}/*如果遇到的是符号,则入list*/if(c == '+' ||c == '-' || c == '/' || c == '*'){list.add(s.substring(index,index+1));index++;}else{//如果是数字则把当前的这数字取完sb = new StringBuilder();while(index<sLen && s.charAt(index)!='+' && s.charAt(index)!='-' && s.charAt(index)!='/' && s.charAt(index)!='*'&& s.charAt(index)!=' '){sb.append(s.charAt(index));index++;}list.add(sb.toString());}}int len = list.size();/* 如果list只有一个元素说明字符串s只有一个数字,直接返回即可 */if (len == 1) {return Integer.valueOf(list.get(0));}/*第一遍相当于把表达式中间的括号都去掉,在压栈的过程中,遇到右括号则把当前最里面括号的内容计算出*/int i = 0;stack.add(list.get(0));// 先把第一个元素入栈i++;while (i < len) {String temp = list.get(i);    if(temp.equals("*")){//如果遇到了*或/则先计算其结果然后入栈int left = Integer.valueOf((String) stack.pop());i++;int right = Integer.valueOf(list.get(i));stack.add(left*right+"");}else if(temp.equals("/")){int left = Integer.valueOf((String) stack.pop());i++;int right = Integer.valueOf(list.get(i));stack.add(left/right+"");}else {stack.add(temp);}i++;}/*然后计算栈内表达式的值*/EntreParentesis(stack);return Integer.valueOf((String) stack.pop());}/* * 计算栈顶的一个括号内的值,现在栈顶的若干个元素如(5-2+3+4, * 这个方法完成的工作就是通过把若干个栈顶元素(左括号之前包括左括号)弹栈计算得出10,然后把10压入栈 */private void EntreParentesis(Stack<String> stack) {int right;// 右操作数int left;// 左操作数/*把(5-2+3+4依次弹栈,然后再压入tempStack中*/Stack<String> tempStack = new Stack<String>();while (!stack.isEmpty()) {tempStack.add(stack.pop());}/*计算tempStack中表达式的值*/String val = (String) tempStack.pop();right = Integer.valueOf(val);while (!tempStack.isEmpty() ) {String oper = tempStack.pop();left = Integer.valueOf(tempStack.pop());if (oper.equals("+")) {right = left + right;} else{right = right - left;}}stack.add(right + "");}




0 0