227. Basic Calculator II

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.

Example 1:

Input: "3+2*2"
Output: 7

写一个计算器,实现四则运算。

 

用逆波兰表示法求解:两个栈 num 和 opt 分别存 运算数字 和 运算符

1、如果是一个数,入栈 num

2、如果是操作符:

2.1、如果是 + 或 -:把 opt 中的所有符号依次出栈,结合位于 num 栈顶的两个数做运算,把运算结果入栈

2.2、如果是 * 或 /:把 opt 中位于栈顶的 * 或 / 依次出栈,结合位于 num 栈顶的两个数做运算,把运算结果入栈

3、遍历完字符后,把 opt 中的剩余的所有符号依次出栈,结合位于 num 栈顶的两个数做运算,把运算结果入栈

最后num中只剩下一个数,就是运算结果

 1 class Solution {
 2 public:
 3     int cal(char opt, int num1, int num2) {
 4         switch(opt) {
 5             case '+':
 6                 return num1 + num2;
 7             case '-':
 8                 return num2 - num1;
 9             case '*':
10                 return num1 * num2;
11             case '/':
12                 return num2 / num1;
13         }
14     }
15     int calculate(string s) {
16         stack<int> num;
17         stack<char> opt;
18         size_t i = 0;
19         size_t next_i;
20         while (i < s.length()) {
21             next_i = s.find_first_of("+-*/", i);
22             if (next_i != string::npos) {
23                 num.push(stoi(s.substr(i, next_i - i)));
24                 char op = s[next_i];
25                 if (op == '+' || op == '-') {
26                     while (!opt.empty()) {
27                         char c = opt.top();
28                         opt.pop();
29                         int num1 = num.top();
30                         num.pop();
31                         int num2 = num.top();
32                         num.pop();
33                         num.push( cal(c, num1, num2) );
34                     }
35                 }
36                 if (op == '*' || op == '/') {
37                     while (!opt.empty() && (opt.top() == '*' || opt.top() == '/')) {
38                         char c = opt.top();
39                         opt.pop();
40                         int num1 = num.top();
41                         num.pop();
42                         int num2 = num.top();
43                         num.pop();
44                         num.push( cal(c, num1, num2) );
45                     }
46                 }
47                 opt.push(op);
48                 i = next_i + 1;
49             }
50             else {
51                 num.push(stoi(s.substr(i, next_i - i)));
52                 break;
53             }
54         }
55         
56         while (!opt.empty()) {
57             char c = opt.top();
58             opt.pop();
59             int num1 = num.top();
60             num.pop();
61             int num2 = num.top();
62             num.pop();
63             num.push( cal(c, num1, num2) );
64         }
65         
66         return num.top();
67 
68     }
69 };

 

posted @ 2018-07-26 15:32  Zzz...y  阅读(365)  评论(0编辑  收藏  举报