实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: “3+2*2”
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator-ii
https://leetcode-cn.com/problems/basic-calculator-ii/solution/chai-jie-fu-za-wen-ti-shi-xian-yi-ge-wan-zheng-ji-/
//没有带括号的简易
class Solution {
public:
int calculate(string s) {
if(s.size() == 0) return 0;
stack <int> st;
int num=0;
char sign ='+'; //第一个数默认push进栈
int ans=0;
for(int i=0;i<s.size();i++)
{
if(s[i]>='0' && s[i]<='9')
{
num=num*10-'0'+s[i];
}
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||i==s.size()-1)
{
//处理前一个运算符
if(sign=='+') st.push(num);
if(sign =='-') st.push(-num);
if(sign=='*')
{
int temp=st.top()*num;
st.pop();
st.push(temp);
}
if(sign == '/')
{
int temp=st.top()/num;
st.pop();
st.push(temp);
}
num=0;
sign=s[i]; //当前运算符记录下来
}
}
while(st.empty()==false)
{
ans=ans+st.top();
st.pop();
}
return ans;
}
};
带括号的简易计算器,括号具有递归的性质,其实就是如果碰到括号就递归本身函数即可。
class Solution {
public:
int calculate(string s) {
int begin = 0;
return calHelper(s, begin);
}
int calHelper(string s, int& i) //i用于记录计算开始的索引
{
char operation = '+';
stack<int> nums;
int num = 0;
int res = 0;
bool flag = false;
for (i; i < s.size(); i++)
{
if (s[i] >= '0' && s[i] <= '9')
{
num = num * 10 + (s[i] - '0');
}
if (s[i] == '(')
{
num = calHelper(s, ++ i); //从i的下一个开始计算, 进入递归
i++; //计算完之后的i指向)所以再++
}
if (((s[i] < '0' || s[i] > '9') && s[i] != ' ') || i >= s.size() - 1) // 继续计算
{
int pre = 0;
switch (operation)
{
case '+': nums.push(num);
break;
case '-': nums.push(-num);
break;
case '*':
pre = nums.top();
nums.pop();
nums.push(pre * num);
break;
case '/':
pre = nums.top();
nums.pop();
nums.push(pre / num);
break;
}
operation = s[i];
num = 0;
}
if (s[i] == ')') //遇到)回到上一级递归
{
break;
}
}
while (!nums.empty())
{
res += nums.top();
nums.pop();
}
return res;
}
};