思路:
首先使用栈实现,关于符号,乘除的优先级要大于加减,所以我们在遍历数字的时候注意优先级;
遍历时,如果符号是乘除,那就先与栈顶数字进行相关计算,再更新数字;如果是减号,就将数字变相反数再放入栈中;最后栈中的所有数字只需要进行相加操作就可以完成。
原题链接:https://leetcode.cn/problems/basic-calculator-ii/description/?favorite=2ckc81c
1.题目如下:
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
示例 1:
输入:s = "3+2*2"
输出:7
示例 2:
输入:s = " 3/2 "
输出:1
示例 3:
输入:s = " 3+5 / 2 "
输出:5
提示:
1 <= s.length <= 3 * 105
s 由整数和算符 (‘+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
s表示一个 有效表达式
表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
题目数据保证答案是一个 32-bit 整数
2.代码如下:
class Solution {
public:
int calculate(string s) {
stack<int> sTemp;
char preSign='+';
int sum=0;
int n=s.length();
for (int i=0;i<n;++i) {
if(isdigit(s[i])) {
sum=sum*10+int(s[i]-'0');
}
if(!isdigit(s[i]) && s[i]!=' '|| i==n-1){
switch (preSign){
//符号的优先级不同,如果是乘除,则先和栈顶数计算,否则放入栈中
case '+':
//第一个数字直接放入栈待计算
sTemp.push(sum);
break;
case '-':
sTemp.push(-sum);
break;
case '*':
sTemp.top()*=sum;
break;
default:
sTemp.top()/=sum;
}
//下一个数字的计算方式由上一个符号决定
preSign=s[i];
sum=0;
}
}
int ans=0;
while(!sTemp.empty()){
ans+=sTemp.top();
sTemp.pop();
}
return ans;
}
};