LeetCode: 227. Basic Calculator II

时间:2022-12-05 17:58:39


LeetCode: 227. Basic Calculator II

题目描述

Implement a basic calculator to evaluate a simple expression string.

The expression string contains only non-negative integers, ​​+​​​, ​​-​​​, ​​*​​​, ​​/​​ operators and empty spaces . The integer division should truncate toward zero.

Example 1:

Input: "3+2*2"
Output: 7

Example 2:

Input: " 3/2 "
Output: 1

Example 3:

Input: " 3+5 / 2 "
Output: 5

Note:

  • You may assume that the given expression is always valid.
  • Do not use the ​​eval​​ built-in library function.

解题思路

将单个数字和乘除法作为加法运算的 “项(item)”,每次获取下一项进行计算。

AC 代码

class Solution {
private:
int Op(char op, int lhv, int rhv)
{
if(op == '+') return lhv+rhv;
else if(op == '-') return lhv-rhv;
else if(op == '*') return lhv*rhv;
else return lhv/rhv;
}
// idx, result
pair<int, int> nextItem(string str, int beg)
{
int result = 0;
int curNum = 0;
char op = '+';
size_t i;

size_t pos = str.find_first_of("+-", beg);
if(pos == str.npos) pos = str.size();
for(i = beg; i <= pos; ++i)
{
if(str[i] == ' ') continue;
if(i == pos)
{
result = Op(op, result, curNum);
break;
}
if(str[i] >= '0' && str[i] <= '9')
{
curNum = curNum*10+str[i]-'0';
}
else if(str[i] == '*' || str[i] == '/')
{
result = Op(op, result, curNum);
op = str[i];
curNum = 0;
}
}

return {i, result};
}
public:
int calculate(string s) {
int result = 0;
int curNum = 0;
int idx = 0;
char op = '+';
pair<int, int> curPair{0,0};

while(idx < s.size())
{
if(s[idx] == ' ')
{
++idx;
continue;
}

if(s[idx] =='+' || s[idx] =='-')
{
op = s[idx++];
continue;
}

curPair = nextItem(s, idx);
result = Op(op, result, curPair.second);
idx = curPair.first;
}

return result;
}
};