forked from xiaoyili/ITint5
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path026_表达式求值.cpp
More file actions
58 lines (53 loc) · 1.82 KB
/
026_表达式求值.cpp
File metadata and controls
58 lines (53 loc) · 1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
作者: Annie Kim, anniekim.pku[at]gmail.com
时间: Sep 19, 2013
题目: 表达式求值
难度: Easy
链接: http://www.itint5.com/oj/#26
问题:
给定一个表达式字符串,其中只包含非负整数,加法,减法以及乘法符号,例如7+3*4*5+2+4-3-1。
请写程序计算该表达式的值。
提示:可以尝试使用递归算法,程序将非常简洁易写,很适用于面试场合。
Solution: 一开始写了逻辑复杂的,看了fabregas4的代码,才知道怎么简化。
关键在于如何利用'n'来统一简化加减乘。
*/
/*---------------------------------------------------------
方案一:递归。
*/
int getNumber(const string &expr, int &i) {
int number = 0, N = expr.size();
while (i < N && expr[i] >= '0' && expr[i] <= '9') {
number = number * 10 + (expr[i] - '0');
i++;
}
return number;
}
int evaluate(const string& expr, int i, int n) {
n *= getNumber(expr, i);
if (i == expr.size()) return n;
if (expr[i] == '*') return evaluate(expr, i + 1, n);
if (expr[i] == '+') return n + evaluate(expr, i + 1, 1);
if (expr[i] == '-') return n + evaluate(expr, i + 1, -1);
}
//返回表达式expr的值
int evaluate(const string& expr) {
return evaluate(expr, 0, 1);
}
/*---------------------------------------------------------
方案二:迭代。‘getNumber’函数在方案一。
*/
//返回表达式expr的值
int evaluate(const string& expr) {
int res = 0;
int i = 0, N = expr.size();
int n = 1;
for (int i = 0; i < N; ++i)
{
int number = getNumber(expr, i);
n *= number;
if (i == N) res += n;
else if (expr[i] == '+') {res += n; n = 1; }
else if (expr[i] == '-') {res += n; n = -1; }
}
return res;
}