P.S 非科班出身,对C++和算法较陌生,从入门开始,使用的是牛客网平台,刷题借鉴了很多前人的思路,博客仅为记录用。
问题3:表达式求值【NC137】
问题描述:请写一个整数计算器,支持加减乘三种运算和括号。
数据范围:
0
≤
∣
s
∣
≤
100
0≤\vert{s}\vert≤100
0≤∣s∣≤100,保证计算结果始终在整型范围内。
问题要求:空间复杂度
O
(
n
)
O(n)
O(n),时间复杂度
O
(
n
)
O(n)
O(n)
解题思路:借鉴了网站的思路,使用栈来储存数字,最终将栈中的数字加到一起去。
如何处理括号:遇到左括号时,要找到其对应的右括号,对其中的数据计算——对自身的迭代。
如何处理乘法:对乘号前后的数字乘之后放到栈里。
如何处理加减法:将加/减法之后的数字直接/加负号后放入栈中。
代码:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
int solve(string s) {
// write code here
stack<int> num_stack;
int num = 0;
int sum = 0;
char sign = '+';
for (int i=0;i<s.length();i++){
if (s[i]=='('){
int left = i+1;
int count = 1;
while (count>0){
i++;
if (s[i] == '(')
count++;
else if (s[i] == ')')
count--;
}
num = solve(s.substr(left,i-left));
}
else if (s[i] >= '0' && s[i] <= '9')
num = num*10 + s[i] - '0';
if (i == s.size() - 1 || s[i] == '+' || s[i] == '-' || s[i] == '*'){
switch(sign){
case '*':
num_stack.top() *= num;
num = 0;
sign = s[i];
break;
case '+':
num_stack.push(num);
num = 0;
sign = s[i];
break;
case '-':
num_stack.push(-num);
num = 0;
sign = s[i];
break;
}
}
}
while(!num_stack.empty()) {
sum += num_stack.top();
num_stack.pop();
}
return sum;
}
};
注意点:
- 声明一个整数栈:
stack<int> num_stack;
; - 判断string长度时,
s.length()
和s.size()
没有区别; num_stack.empty()
判断栈是否为空;num_stack.top()
指的是栈顶数字;num_stack.push(num)
是将数字压进栈(到栈顶);num_stack.pop()
将栈顶的数字移除出栈(这时栈顶变为下一个数字)。- 栈的简单讲解见参考资料2,栈服从先进后出的原则。
参考资料: