From d659d7482be54daf78b19f28f7f0e4935dd788df Mon Sep 17 00:00:00 2001 From: ShusenTang Date: Sat, 21 Sep 2019 17:40:00 +0800 Subject: [PATCH] Create 227. Basic Calculator II.md --- solutions/227. Basic Calculator II.md | 46 +++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 solutions/227. Basic Calculator II.md diff --git a/solutions/227. Basic Calculator II.md b/solutions/227. Basic Calculator II.md new file mode 100644 index 0000000..336658d --- /dev/null +++ b/solutions/227. Basic Calculator II.md @@ -0,0 +1,46 @@ +# [227. Basic Calculator II](https://leetcode.com/problems/basic-calculator-ii/) + +# 思路 +计算一个简单的算术表达式的值,表达式只包含数字、空格、加减乘除。 此题的难点就在于乘除应该优先计算。 + +由于乘除优先,所以我们使用一个栈保存计算乘除后的结果,还需要用一个标记记录当前数字前的运算符: +* 若当前数字之前的符号是加,那么把当前数字压入栈中; +* **若当前数字之前的符号是减,那么把当前数字的相反数压入栈中;** +* 若当前数字之前的符号是乘或除,那么从栈顶取出一个数字和当前数字进行乘或除的运算,再把结果压入栈中。 + +这样完成一遍遍历后,所有的乘或除都运算完了,再把栈中所有的数字都加起来就是最终结果了。 + +# C++ +``` C++ +class Solution { +public: + int calculate(string s) { + int res = 0, num = 0, n = s.size(); + char op = '+'; + stackstk; + for(int i = 0; i < n; i++){ + if(s[i] >= '0' && s[i] <= '9') + num = 10 * num + (int)(s[i] - '0'); + + if(i == n - 1 || s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/'){ + if(op == '+') stk.push(num); + else if(op == '-') stk.push(-1*num); + else{ // * or / + int tmp = stk.top(); stk.pop(); + if(op == '*') stk.push(tmp * num); + else stk.push(tmp / num); + } + num = 0; + op = s[i]; + } + } + + while(!stk.empty()){ + res += stk.top(); + stk.pop(); + } + + return res; + } +}; +```