1. 题目
给定一个包含 正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+, - ,*,/
四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7示例 2:
输入: " 3/2 "
输出: 1示例 3:
输入: " 3+5 / 2 "
输出: 5说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/calculator-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
几个易错例子
"2147483647"
" 3+5 / 2 "
"+3+2*2"
"-3+2*2"
class Solution {
public:int calculate(string s) {long a, sum, i = 0;char op = '+';while(i < s.size() && s[i]==' ')i++;//处理空格stack<int> stk;if(i < s.size() && s[i] == '+')i++;else if(i < s.size() && s[i] == '-'){op = '-';i++;}for( ; i < s.size(); ++i){a = 0;while(i < s.size() && s[i]==' ')i++;//处理空格while(i < s.size() && isdigit(s[i]))a = a*10+s[i++]-'0';if(op == '*'){ a = stk.top() * a;stk.pop();sum = 0;while(!stk.empty()){sum += stk.top();stk.pop();}stk.push(sum);stk.push(a);}else if(op == '/'){ a = stk.top() / a;stk.pop();sum = 0;while(!stk.empty()){sum += stk.top();stk.pop();}stk.push(sum);stk.push(a);}else if(op == '-')stk.push(-a);elsestk.push(a);while(i < s.size() && s[i]==' ')i++;//处理空格if(i < s.size())op = s[i];}sum = 0;while(!stk.empty()){sum += stk.top();stk.pop();}return sum;}
};
20 ms 8.8 MB