此题是比较难的一个题,不能简单的用递归来做。假设我们已经能把数字分离出来,并且解决了其他无关细节。此时我们要考虑,如何处理括号和运算优先级。
此题最强的一点是,当你看到一个符号时,你就可以决定上一个运算是否可以立即执行。比如,你看到了+,那么上一步的乘法就可以立即执行。这里,我们要将括号分开处理,因为这不是一个操作,我们不希望他提前执行。
通过上一步的处理之后,所有符号应该都是优先级递增的,所以都可以被逆序执行。这是一个很隐晦的单调栈。
通过上述分析,我们可以把步骤分解为以下的贪心思想:
遇见空格:跳过
遇见左括号:加入ops中
遇见右括号:处理数据,直到遇见左括号。
遇见运算符:递归去掉前面更大的运算符,并加入ops中
nums数组用来存数,具体可看代码细节。
class Solution {
public:
int calculate(string s) {
vector<int> nums;
vector<char> ops;
int num = 0, numbering = 0;
map<int, int> m = {
{
'+',1}, {
'-',1}, {
'*',2}, {
'/',2}, {
'(', 0}};
for(int i=0;i<s.size();i++)
{
char c = s[i];