[LeetCode] 224. Basic Calculator 基本计算器
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.
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | public int calculate(String s) { // delte white spaces s = s.replaceAll( " " , "" ); Stack<String> stack = new Stack<String>(); char [] arr = s.toCharArray(); StringBuilder sb = new StringBuilder(); for ( int i = 0 ; i < arr.length; i++) { if (arr[i] == ' ' ) continue ; if (arr[i] >= '0' && arr[i] <= '9' ) { sb.append(arr[i]); if (i == arr.length - 1 ) { stack.push(sb.toString()); } } else { if (sb.length() > 0 ) { stack.push(sb.toString()); sb = new StringBuilder(); } if (arr[i] != ')' ) { stack.push( new String( new char [] { arr[i] })); } else { // when meet ')', pop and calculate ArrayList<String> t = new ArrayList<String>(); while (!stack.isEmpty()) { String top = stack.pop(); if (top.equals( "(" )) { break ; } else { t.add( 0 , top); } } int temp = 0 ; if (t.size() == 1 ) { temp = Integer.valueOf(t.get( 0 )); } else { for ( int j = t.size() - 1 ; j > 0 ; j = j - 2 ) { if (t.get(j - 1 ).equals( "-" )) { temp += 0 - Integer.valueOf(t.get(j)); } else { temp += Integer.valueOf(t.get(j)); } } temp += Integer.valueOf(t.get( 0 )); } stack.push(String.valueOf(temp)); } } } ArrayList<String> t = new ArrayList<String>(); while (!stack.isEmpty()) { String elem = stack.pop(); t.add( 0 , elem); } int temp = 0 ; for ( int i = t.size() - 1 ; i > 0 ; i = i - 2 ) { if (t.get(i - 1 ).equals( "-" )) { temp += 0 - Integer.valueOf(t.get(i)); } else { temp += Integer.valueOf(t.get(i)); } } temp += Integer.valueOf(t.get( 0 )); return temp; } |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | class Solution: # @param {string} s # @return {integer} def calculate( self , s): operands, operators = [], [] operand = "" for i in reversed ( xrange ( len (s))): if s[i].isdigit(): operand + = s[i] if i = = 0 or not s[i - 1 ].isdigit(): operands.append( int (operand[:: - 1 ])) operand = "" elif s[i] = = ')' or s[i] = = '+' or s[i] = = '-' : operators.append(s[i]) elif s[i] = = '(' : while operators[ - 1 ] ! = ')' : self .compute(operands, operators) operators.pop() while operators: self .compute(operands, operators) return operands[ - 1 ] def compute( self , operands, operators): left, right = operands.pop(), operands.pop() op = operators.pop() if op = = '+' : operands.append(left + right) elif op = = '-' : operands.append(left - right) |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | class Solution { public : int calculate(string s) { int res = 0, sign = 1, n = s.size(); stack< int > st; for ( int i = 0; i < n; ++i) { char c = s[i]; if (c >= '0' ) { int num = 0; while (i < n && s[i] >= '0' ) { num = 10 * num + s[i++] - '0' ; } res += sign * num; --i; } else if (c == '+' ) { sign = 1; } else if (c == '-' ) { sign = -1; } else if (c == '(' ) { st.push(res); st.push(sign); res = 0; sign = 1; } else if (c == ')' ) { res *= st.top(); st.pop(); res += st.top(); st.pop(); } } return res; } }; |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | class Solution2 { public : int calculate(string s) { stack< int > operands; stack< char > operators; string operand; for ( int i = s.length() - 1; i >= 0; --i) { if ( isdigit (s[i])) { operand.push_back(s[i]); if (i == 0 || ! isdigit (s[i - 1])) { reverse(operand.begin(), operand.end()); operands.emplace(stoi(operand)); operand.clear(); } } else if (s[i] == ')' || s[i] == '+' || s[i] == '-' ) { operators.emplace(s[i]); } else if (s[i] == '(' ) { while (operators.top() != ')' ) { compute(operands, operators); } operators.pop(); } } while (!operators.empty()) { compute(operands, operators); } return operands.top(); } void compute(stack< int >& operands, stack< char >& operators) { const int left = operands.top(); operands.pop(); const int right = operands.top(); operands.pop(); const char op = operators.top(); operators.pop(); if (op == '+' ) { operands.emplace(left + right); } else if (op == '-' ) { operands.emplace(left - right); } } }; |
类似题目:
[LeetCode] 227. Basic Calculator II 基本计算器 II
All LeetCode Questions List 题目汇总
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步