描述
请写一个整数计算器,支持加减乘三种运算和括号。
数据范围:0\le |s| \le 1000≤∣s∣≤100,保证计算结果始终在整型范围内
要求:空间复杂度: O(n)O(n),时间复杂度 O(n)O(n)
示例1
输入:
"1+2"复制
返回值:
3复制
示例2
输入:
"(2*(3-4))*5"复制
返回值:
-10复制
示例3
输入:
"3+2*3*4-1"复制
返回值:
26
1、表达式中有括号、乘号,要重点考虑优先级问题;
2、加号和减号可以合并为加法,减号为加一个负数;括号可以看做一个子问题,使用递归的方法计算;
3、默认运算符为加法,轮询字符串s:
遇到数字后将数字组合为num,将num压入栈;
遇到'('后递归调用,递归方法在遇到‘(’后结束;
先根据前置运算符将计算结果入栈,如果前置运算符是乘法,则弹出栈顶元素与当前元素相乘后入栈(先弹出再入栈!!);
4、注意对队尾元素的处理,除队尾外,遇到数字要累积计算num直到非数字,到队尾后要能走到入栈流程。
if (i != len - 1) {
continue;
}
完整代码如下:
class Solution {
public:
vector<int> func(string s, int index) {
stack<int> st;
char op = '+';
int num = 0;
int len = s.size();
vector<int> res(2, 0);
for (int i = index; i < len; i++) {
if (s[i] >= '0' && s[i] <= '9') {
num = num * 10 + (s[i] - '0');
if (i != len - 1) {
continue;
}
}
if (s[i] == '(') {
vector<int> tmp(2, 0);
tmp = func(s, i+1);
num = tmp[0];
i = tmp[1];
if (i != len - 1) {
continue;
}
}
switch(op) {
case '+':
st.push(num);
break;
case '-':
st.push(-num);
break;
case '*':
{
int t = st.top();
st.pop();
st.push(t*num);
break;
}
default:
break;
}
if (s[i] == ')') {
res[1] = i;
break;
} else {
op = s[i];
}
num = 0;
}
num = 0;
while (!st.empty()) {
num += st.top();
st.pop();
}
res[0] = num;
return res;
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
int solve(string s) {
// write code here
vector<int> res(2, 0);
res = func(s, 0);
return res[0];
}
};

京公网安备 11010502036488号