表达式求值
[题](表达式求值_牛客题霸_牛客网 (nowcoder.com))
代码
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
59
60
61
62
63
64
65
66
67
68
69
70
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
vector<int> func(string str,int sub){
int num=0;
char op='+';//默认前面的数是+
int i=sub;//设置值下表,用于递归
int sum=0;//和
vector<int> vector;//通过vector,返回sum,和下标
stack<int> stack;//栈区存放数字
for(;i<str.size();++i) {
//下面的是,用于计算数字比如100,这样的多位数字
if (isdigit(str[i])) {
num = num * 10 + str[i] - '0';
if (i != str.size() - 1) {
continue;
}
}
//递归标志
if (str[i] == '(') {
vector = func(str, ++i);
//vector[0],用于存放sum
//vector[1],用于存放下标
num=vector[0];
i=vector[1];
if(i!=str.size()-1){
continue;
}
}
switch (op) {
case '+':
stack.push(num);
break;
case '-':
stack.push(-num);
break;
case '*':
num *= stack.top();
stack.pop();
stack.push(num);
break;
}
num=0;
if (str[i] == ')') {
break;//递归结束的标志
}else {
op=str[i];
}
}
//下面是求和的过程
while(!stack.empty()){
sum+=stack.top();
stack.pop();
}
return ::vector<int>{sum,i};
}
int solve(string s) {
// write code here
return func(s,0).front();
}
};提示
采取栈加递归的方式
如果是数字,根据前面的符号放进入栈区,如果是’+’,则直接放进去,如果是’-‘,就放入相反数,如果是’*’,就从栈区取出一个元素,然后计算。
如果遇到
(
,当作递归的标志,进行递归(注意要设置下标)。如果像
100
,这样的多位数字,就应该进行数字的录入理解
- 采用
func()
,简化运算,方便调用 - 使用
vector
,可以采用返回两个元素(sum,下标)
- 采用
问题
-
表达式求值
https://tsy244.github.io/2023/04/21/算法/newcoder/表达式求值/