码迷,mamicode.com
首页 > 其他好文 > 详细

227. Basic Calculator II

时间:2018-07-26 16:17:35      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:ext   class   expr   alc   substr   express   入栈   操作符   表示   

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

标签:ext   class   expr   alc   substr   express   入栈   操作符   表示   

原文地址:https://www.cnblogs.com/Zzz-y/p/9372075.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!