# coding: utf-8 class Solution: # @param expression: a list of strings; # @return: an integer def evaluateExpression(self, expression): # write your code here ''' å è½¬æ¢æåç¼è¡¨è¾¾å¼ï¼ç¶åå计ç®åç¼è¡¨è¾¾å¼çå¼ã åç¼è¡¨è¾¾å¼è½¬æ¢æ¥éª¤ï¼ 1. å®ä¹ä¸¤ä¸ªå æ ï¼è¡¨è¾¾å¼æ exåè¿ç®ç¬¦æ opã 2. ä»å·¦å°å³æ«æä¸ç¼è¡¨è¾¾å¼ 3. é尿使°ï¼ç´æ¥è¿exã 4. éå°è¿ç®ç¬¦ï¼ä¸opæ é¡¶å ç´ æ¯è¾ä¼å 级 - 4.1. 妿opä¸ºç©ºï¼æè æ é¡¶è¿ç®ç¬¦ä¸º'('ï¼å ¥æ ã - 4.2. è¥ä¼å 级é«äºopæ é¡¶è¿ç®ç¬¦ï¼å ¥ç«ã - 4.3. å¼¹åºopæ é¡¶å ç´ åå ¥exï¼å次转å°4.1ã 5. 妿è¿ç®ç¬¦æ¯'('æ'))' - 5.1. '('ç´æ¥å ¥æ - 5.2. 妿æ¯')'ï¼ä¸æ¬¡å°opæ æä½ç¬¦å¼¹åºå¹¶å ¥åexæ ï¼ç´å°éå°'('ï¼æå¼å¹é æ¬å·ã 6. éå¤2å°5 7. å°opæ å å©ä½å ç´ ä¾æ¬¡å¼¹åºå¹¶åå ¥exæ ã å ³äºåç¼è¡¨è¾¾å¼ç计ç®èªå·±googleå»ã ''' op_rank = {'+': 1, '-':1, '*':2, '/': 2, '(': 3, ')': 3} post_expr = [] op_stack = [] for item in expression: if self.isOperand(item): # #1 post_expr.append(item) elif item == ')': # step #5 while op_stack and op_stack[-1] != '(': # #5.2 post_expr.append(op_stack.pop()) op_stack.pop() else: # #4.1 and #4.2 while op_stack and (op_stack[-1] != '(') and (op_rank[item] <= op_rank[op_stack[-1]]): post_expr.append(op_stack.pop()) op_stack.append(item) # #4.1 and #5.1 while op_stack: post_expr.append(op_stack.pop()) # #7 ret = [] for item in post_expr: if self.isOperand(item): ret.append(int(item)) else: right_val = ret.pop() left_val = ret.pop() if item == '*': ret.append(left_val * right_val) elif item == '/': ret.append(left_val / right_val) elif item == '+': ret.append(left_val + right_val) else: ret.append(left_val - right_val) return 0 if not ret else ret[0] # å°å¿å ¨æ¬å·çåºæ¯ def isOperand(self, item): # è¿éå·ä¸ªæï¼æµè¯æ°æ®æ²¡æè´æ°ï¼ return (item[0] >= '0') and (item[0] <= '9') # hard: http://lintcode.com/problem/expression-evaluation