227. Basic Calculator II

Posted zzz-y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 };

 

以上是关于227. Basic Calculator II的主要内容,如果未能解决你的问题,请参考以下文章

227. Basic Calculator II

227. Basic Calculator II

227. Basic Calculator II

LeetCode 227. 基本计算器 II(Basic Calculator II)

leetcode 227. Basic Calculator II ---------- java

Leetcode 227. Basic Calculator II JAVA语言