标签:
问题描述
Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open (
and closing parentheses )
, the plus +
or minus sign -
, non-negative integers and empty spaces
.
You may assume that the given expression is always valid.
Some examples:
"1 + 1" = 2 " 2-1 + 2 " = 3 "(1+(4+5+2)-3)+(6+8)" = 23
Note: Do not use the eval
built-in library function.
程序
第一种是普通的方法:先将表达式转成后缀表达式,然后再计算。(TLE)
第二种是简化的方法,比较巧妙。
public class BasicCalculator { public int calculate(String s) { if (s == null || s.length() == 0) { return 0; } // preprocess s = s.trim(); char[] cc = s.toCharArray(); String new_s = ""; for (int i = 0; i < cc.length; i++) { if (cc[i] == ‘(‘ || cc[i] == ‘)‘) { continue; } if (cc[i] == ‘+‘ || cc[i] == ‘-‘) { new_s += " " + cc[i] + " "; } else { new_s += cc[i]; } } String[] items = new_s.split(" "); List<String> postExpressionList = new ArrayList<String>(); Stack<String> st = new Stack<String>(); // transform to postfix expression for (int i = 0; i < items.length; i++) { String item = items[i].trim(); if (item.length() == 0) { continue; } if (item.equals("+") || item.equals("-")) { if (!st.isEmpty()) { postExpressionList.add(st.pop()); } st.push(item); } else { postExpressionList.add(item); } } while (!st.isEmpty()) { postExpressionList.add(st.pop()); } // calculate Stack<Integer> calStack = new Stack<Integer>(); for (String ex : postExpressionList) { if (ex.equals("+")) { int n1 = calStack.pop(); int n2 = calStack.pop(); calStack.push(n1 + n2); } else if (ex.equals("-")) { int n1 = calStack.pop(); int n2 = calStack.pop(); calStack.push(n2 - n1); } else { calStack.push(Integer.valueOf(ex)); } } return calStack.peek(); } public int calculate2(String s) { if (s == null || s.length() == 0) { return 0; } s = s.trim(); int res = 0, sign = 1; Stack<Integer> st= new Stack<Integer>(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (Character.isDigit(c)) { int cur = c - ‘0‘; while (i+1 < s.length() && Character.isDigit(s.charAt(i+1))) { cur = cur * 10 + (s.charAt(i+1) - ‘0‘); ++i; } res += sign * cur; }else if (c == ‘+‘) { sign = 1; }else if (c == ‘-‘){ sign = -1; }else if (c == ‘(‘) { st.push(res); res = 0; st.push(sign); sign = 1; }else if (c == ‘)‘) { res = st.pop()*res + st.pop(); sign = 1; } } return res; } }
标签:
原文地址:http://www.cnblogs.com/harrygogo/p/4647978.html