傳送門git
給你一個字符串表達式 s ,請你實現一個基本計算器來計算並返回它的值。code
整數除法僅保留整數部分。blog
示例 1:圖片
輸入:s = "3+2*2"
輸出:7leetcode
示例 2:字符串
輸入:s = " 3/2 "
輸出:1get
示例 3:源碼
輸入:s = " 3+5 / 2 "
輸出:5it
提示:模板
1 <= s.length <= 3 * 105 s 由整數和算符 ('+', '-', '*', '/') 組成,中間由一些空格隔開 s 表示一個 有效表達式 表達式中的全部整數都是非負整數,且在範圍 [0, 231 - 1] 內 題目數據保證答案是一個 32-bit 整數
來源:力扣(LeetCode)
int calculate(char * s){ }
本題依舊是計算器運算的實現。對於題目的要求咱們依舊是從兩個方面入手解決,輸入的是字符串s。s中所包含的有兩種元素(不包括空格),就是數字和運算符兩種。運算數字num的處理就是經過簡單的差值轉化。
if (isdigit(s[i])) { num = num * 10 + (int)(s[i] - '0'); }
對於運算符咱們須要考慮"+-* / "的四種符號處理方法,很顯然咱們要作的是對於 "* /" 兩種進行優先處理。因此這裏須要用到棧。
+-符號後面的num能夠直接感受符號決定壓入num仍是-num
case '+': stk[top++] = num; break; case '-': stk[top++] = -num; break;
而對於*和/兩種狀況,須要在入棧時就對元素進行操做,來達到有限操做乘除的效果。達到這效果就是對於棧頂元素進行處理,這樣最後的統計時就是已經操做過乘除的元素求和就好了。
case '*': stk[top - 1] *= num; break; default: stk[top - 1] /= num; }
int calculate(char* s) { int n = strlen(s); int stk[n], top = 0; char preSign = '+'; int num = 0; for (int i = 0; i < n; ++i) { if (isdigit(s[i])) { num = num * 10 + (int)(s[i] - '0'); } if (!isdigit(s[i]) && s[i] != ' ' || i == n - 1) { switch (preSign) { case '+': stk[top++] = num; break; case '-': stk[top++] = -num; break; case '*': stk[top - 1] *= num; break; default: stk[top - 1] /= num; } preSign = s[i]; num = 0; } } int ret = 0; for (int i = 0; i < top; i++) { ret += stk[i]; } return ret; }