文章目录
- 题目解析
- 算法解析
- 算法模拟
- 第一步
- 第二步
- 第三步
- 第四步第五步
- 第六步
- 最后一步
- 代码
题目解析
题目链接
我们先来看一下题目这个题目的意思很明确就是给你一个算数式让你计算结果并返回并且给了很多辅助条件来帮助你。
算法解析
那么我们来看看这个题目有哪些做法,首先碰到这种算数类的题目我们脑海中首先要有一个大致思路这一类题目基本上都是用栈来模拟的这个题目也不例外可以用栈来模拟。那么我们来看看如何模拟这个题目
算法模拟
首先我们列出一个算式以答案中的例子为例
首先我们建立一个栈并设置一个字符让这个字符变量初始为‘+’然后再来模拟一下下面的步骤
第一步
首先先设置一个字符将这个字符设置为+号因为我们是要将这些数字通过符号判断正负来放入栈中,我们知道减去一个数字等于加上一个数字的负数因此我们到后面加减操作就可以转化为加法操作了这一点到后面我们就知道了
第二步
第二步判断此时se的符号并选择后续操作并让箭头向后移动
第三步
第四步第五步
第六步
此时指针已经指向了最后并且✖号两边的元素都已经放入栈中。
最后一步
最后一步就简单了我门只需要将栈中元素逐个弹出并且相加即可
代码
class Solution {
public:
int calculate(string n) {
string s;
for (auto ne : n) {
if (ne != ' ') {
s.push_back(ne);
}
}
char se = '+';
stack<int>st;
for (int i = 0; i < s.size(); i++) {
long long sum = 0;
if (s[i] >= '0' && s[i] <= '9') {
int j = i;
while (j < s.size() && s[j] >= '0' && s[j] <= '9') {
sum = sum * 10 + s[j] - '0';
j++;
}
if (se == '+') {
st.push(sum);
}
else if (se == '-') {
st.push(-1 * sum);
}
i = j-1;
}
if (s[i] == '-') {
se = '-';
}
else if (s[i] == '+') {
se = '+';
}
else if (s[i] == '/') {
int j = i+1;
while (j < s.size() && s[j] >= '0' && s[j] <= '9') {
sum = sum * 10 + s[j] - '0';
j++;
}
int t = st.top();
st.pop();
st.push(t / sum);
i = j-1;
}
else if (s[i] == '*') {
int j = i + 1;
while (j < s.size() && s[j] >= '0' && s[j] <= '9') {
sum = sum * 10 + s[j] - '0';
j++;
}
int t = st.top();
st.pop();
st.push(sum * t);
i = j-1;
}
}
int ans = 0;
while (!st.empty()) {
ans += st.top();
st.pop();
}
return ans;
}
};
和自己的爱人一辈子快乐的在一起吧