Leetcode224. 基本計(jì)算器

題目

實(shí)現(xiàn)一個(gè)基本的計(jì)算器來計(jì)算一個(gè)簡單的字符串表達(dá)式的值。

字符串表達(dá)式可以包含左括號 ( 叠纹,右括號 )竖慧,加號 + 嫌套,減號 -,非負(fù)整數(shù)和空格 圾旨。

示例 1:

輸入: "1 + 1"
輸出: 2
示例 2:

輸入: " 2-1 + 2 "
輸出: 3
示例 3:

輸入: "(1+(4+5+2)-3)+(6+8)"
輸出: 23

C++解法

#include <iostream>
#include <vector>
#include <map>
#include <set>
using namespace std;
class Solution {
public:
    bool isNumber(char c) { return c >= 48 && c <= 57; }
    
    int evaluate(string & numberString)  {
        int value = 0;
        for (char digit: numberString) {
            value *= 10;
            value += digit - '0';
        }
        numberString.clear();
        return value;
    }
    
    int evaluate(vector<char> & operatorStack, vector<int> & operandStack) {
        int result = operandStack[0];
        for (int i = 0; i < operatorStack.size(); i++) {
            if (operatorStack[i] == '+') result += operandStack[i + 1];
            else if (operatorStack[i] == '-') result -= operandStack[i + 1];
        }
        operatorStack.clear();
        operandStack.clear();
        return result;
    }
    
    int calculate(string s) {
        bool isEvaluating = false;
        int depth = 0, maxDepth = 0;
        string prevString = "", nextString = "", numberString = "";
        vector<int> operands = {};
        vector<char> operators = {};
        for (auto c: s) {
            if (isNumber(c) || c == '+' || c == '-' || c == '(' || c == ')') prevString.push_back(c);
        }
        do {
            maxDepth = 0;
            depth = 0;
            numberString.clear();
            int value = 0;
            for (char c: prevString) {
                if (c == '(') {
                    ++depth;
                } else if (c == ')') {
                    if (depth > maxDepth) maxDepth = depth;
                    --depth;
                }
            }
            depth = 0;
            isEvaluating = false;
            for (int i = 0; i < prevString.size(); ++i) {
                char c = prevString[i];
                if (c == '(') {
                    ++depth;
                    if (depth == maxDepth) {
                        isEvaluating = true;
                    } else {
                        nextString.push_back(c);
                    }
                } else if (c == ')') {
                    if (isEvaluating) {
                        if (!numberString.empty()) {
                            value = evaluate(numberString);
                            operands.push_back(value);
                        }
                        int result = evaluate(operators, operands);
                        if (nextString.empty()) {
                            return result;
                        } else {
                            if (result >= 0) {
                                 nextString.append(to_string(result));
                             } else {
                                 if (nextString[nextString.size() - 1] == '+') {
                                     nextString[nextString.size() - 1] = '-';
                                 } else if (nextString[nextString.size() - 1] == '-') {
                                     nextString[nextString.size() - 1] = '+';
                                 }
                                 nextString.append(to_string(abs(result)));
                             }
                        }
                        isEvaluating = false;
                    } else {
                        nextString.push_back(c);
                    }
                    --depth;
                } else {
                    if (isEvaluating || maxDepth == 0) {
                        if (c == '+' || c == '-') {
                            operators.push_back(c);
                        } else if (isNumber(c)) {
                            numberString.push_back(c);
                        }
                        if (i == prevString.size() - 1 || !isNumber(c)) {
                            if (!numberString.empty()) {
                                value = evaluate(numberString);
                                operands.push_back(value);
                            }
                        }
                    } else {
                        nextString.push_back(c);
                    }
                }
            }
            prevString = nextString;
            nextString = "";
        } while (maxDepth > 0);
        return evaluate(operators, operands);
    }
};

int main(int argc, const char * argv[]) {
    // insert code here...
    Solution solution;
    cout << solution.calculate("1 + 2") << endl;
    cout << solution.calculate("2 - 1 + 2") << endl;
    cout << solution.calculate("1 + 1") << endl;
    cout << solution.calculate("2 - (5 - 6)") << endl;
    cout << solution.calculate("(1+(4+5+2)-3)+(6+8)") << endl;
    cout << solution.calculate("(5-1)") << endl;
    cout << solution.calculate("(5-(1+(5)))") << endl;
    cout << solution.calculate("(1-5)") << endl;
    cout << solution.calculate("2 - 1 + 2") << endl;
    cout << solution.calculate("(1 + ((2 + 3) * (4 * 5)))") << endl;
    cout << solution.calculate("((1+(((4+5)+2)-3))+(6+8))") << endl;
    return 0;
}

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/basic-calculator

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末踱讨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子砍的,更是在濱河造成了極大的恐慌痹筛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挨约,死亡現(xiàn)場離奇詭異味混,居然都是意外死亡产雹,警方通過查閱死者的電腦和手機(jī)诫惭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔓挖,“玉大人夕土,你說我怎么就攤上這事∥僚校” “怎么了怨绣?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拷获。 經(jīng)常有香客問我篮撑,道長,這世上最難降的妖魔是什么匆瓜? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任赢笨,我火速辦了婚禮未蝌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茧妒。我一直安慰自己萧吠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布桐筏。 她就那樣靜靜地躺著纸型,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梅忌。 梳的紋絲不亂的頭發(fā)上狰腌,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音铸鹰,去河邊找鬼癌别。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蹋笼,可吹牛的內(nèi)容都是我干的展姐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼剖毯,長吁一口氣:“原來是場噩夢啊……” “哼圾笨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逊谋,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤擂达,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后胶滋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體板鬓,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年究恤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俭令。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡部宿,死狀恐怖抄腔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情理张,我是刑警寧澤赫蛇,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站雾叭,受9級特大地震影響悟耘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜织狐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一暂幼、第九天 我趴在偏房一處隱蔽的房頂上張望掘殴。 院中可真熱鬧,春花似錦粟誓、人聲如沸奏寨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽病瞳。三九已至,卻和暖如春悲酷,著一層夾襖步出監(jiān)牢的瞬間套菜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工设易, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逗柴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓顿肺,卻偏偏與公主長得像戏溺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子屠尊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • ??引用類型的值(對象)是引用類型的一個(gè)實(shí)例讼昆。 ??在 ECMAscript 中托享,引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)...
    霜天曉閱讀 1,054評論 0 1
  • 一浸赫、Python簡介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個(gè)...
    _小老虎_閱讀 5,744評論 0 10
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,233評論 0 4
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,381評論 0 5
  • 字符串的基本操作 字符串是Python中最常用的數(shù)據(jù)類型闰围。我們可以使用引號('或")創(chuàng)建字符串。創(chuàng)建字符串很簡單既峡,...
    瀧汰泱閱讀 845評論 0 0