力扣227. 基本計算器 II-C語言實現-中等難度題

題目

傳送門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;
}

運行結果

在這裏插入圖片描述

相關文章
相關標籤/搜索