[LeetCode][JavaScript]Basic Calculator

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.

https://leetcode.com/problems/basic-calculator/

 

 


 

 

这这这不是我每天都为之纠结的后缀表达式吗。

题目比较简单只有加减法,而且没有算上负数。

我赌5毛,将来会有一道hard就是这题带上负数,小数,大小括号,乘除法之类,名字我都起好了Basic Calculator II。

2个栈,第一个是放运算结果(或者中间运算结果)的栈resultStack,第二个是放运算符的栈opStack。

举栗子:1+2

1 --> resultStack : [1], opStack : []

+ --> resultStack : [1], opStack : [+]

2 --> resultStack : [1,2], opStack : [+]

压缩二元运算操作compress_2operators() --> resultStack : [3], opStack : []

结束

 

举栗子2: 3-(2-1)

3 --> resultStack : [3], opStack : []

- --> resultStack : [3], opStack : [-]

( --> resultStack : [3], opStack : [-,(]

2 --> resultStack : [3,2], opStack : [-,(]

- --> resultStack : [3,2], opStack : [-,(,-]

1 --> resultStack : [3,2,1], opStack : [-,(,-]

) --> 压缩括号操作compress_bracket(),中间会调用compress_2operators() --> resultStack : [3,1], opStack : [-]

压缩二元运算操作compress_2operators() --> resultStack : [2], opStack : []

结束

 

如果要加上乘除法,需要修改一下正则,加上乘除法和加减法的优先级。

 

 1 /**
 2  * @param {string} s
 3  * @return {number}
 4  */
 5 var calculate = function(s) {
 6     var resultStack = [];
 7     var opStack = [];
 8     var temp = "";
 9     for(var i = 0; i < s.length; i++){
10         var ch = s[i];
11         if(/^(\+|\-)$/.test(ch)){ // + -
12             compress_2operators();
13             opStack.push(ch);
14         } else if (ch === '('){
15             opStack.push(ch);
16         } else if (ch === ')'){
17             compress_bracket();
18         } else if (/^[0-9]$/.test(ch)){
19             temp += ch;
20         }
21 
22         if(s[i + 1] && /^(\+|\-|\(|\))$/.test(s[i + 1])){ // + - ( )
23             if(temp !== ""){
24                 resultStack.push(parseInt(temp));
25                 temp = "";
26             }
27         }
28     }
29     if(temp !== ""){
30         resultStack.push(parseInt(temp));
31         temp = "";
32     }
33     compress_2operators();
34     return resultStack.pop();
35 
36     function compress_bracket(){
37         while(opStack[opStack.length - 1] !== '('){
38             compress_2operators();
39         }
40         opStack.pop(); //(
41     }
42     function compress_2operators(){
43         while(/^(\+|\-)$/.test(opStack[opStack.length - 1])){ // + -
44             var op = opStack.pop();
45             var right = resultStack.pop();
46             var left = resultStack.pop();
47             if(op === '+'){
48                 resultStack.push(left + right);
49             }else{
50                 resultStack.push(left - right);
51             }
52         }
53     }
54 };

 

 

 

 

 

posted @ 2015-06-09 23:22  `Liok  阅读(576)  评论(0编辑  收藏  举报