国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)與算法】雙棧法解決表達(dá)式計(jì)算問題

這篇具有很好參考價(jià)值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)與算法】雙棧法解決表達(dá)式計(jì)算問題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、基本計(jì)算器Ⅰ

題目鏈接

題目描述:

給你一個(gè)字符串表達(dá)式 s ,請(qǐng)你實(shí)現(xiàn)一個(gè)基本計(jì)算器來計(jì)算并返回它的值。
注意:不允許使用任何將字符串作為數(shù)學(xué)表達(dá)式計(jì)算的內(nèi)置函數(shù),比如 eval() 。

示例 1:

輸入:s = “1 + 1”
輸出:2

示例 2:

輸入:s = " 2-1 + 2 "
輸出:3

示例 3:

輸入:s = “(1+(4+5+2)-3)+(6+8)”
輸出:23

提示:

1 <= s.length <= 3 * 105
s 由數(shù)字、‘+’、‘-’、‘(’、‘)’、和 ’ ’ 組成
s 表示一個(gè)有效的表達(dá)式
‘+’ 不能用作一元運(yùn)算(例如, “+1” 和 “+(2 + 3)” 無效)
‘-’ 可以用作一元運(yùn)算(即 “-1” 和 “-(2 + 3)” 是有效的)
輸入中不存在兩個(gè)連續(xù)的操作符
每個(gè)數(shù)字和運(yùn)行的計(jì)算將適合于一個(gè)有符號(hào)的 32位 整數(shù)

思路分析
用兩個(gè)棧:
nums:存數(shù)字字符
ops:存符號(hào)字符

從前向后遍歷字符串,因?yàn)檫@道題只有+/-,所以不用考慮符號(hào)優(yōu)先級(jí)問題。
遍歷過程有以下幾種情況:

1?? 空格:直接跳過
2?? 數(shù)字字符:向后遍歷取出完整數(shù)字,放入nums中。
3?? (:直接放入ops中,等待)與之匹配
4?? ):利用兩個(gè)棧計(jì)算,直到遇到(,結(jié)果放入nums中,再把(出棧
5?? +/-先把前面能計(jì)算的都計(jì)算了(一直算到遇到(為止),結(jié)果放入nums中,符號(hào)放入ops中

關(guān)于首字符帶符號(hào)的處理:
可以先往nums中加一個(gè)0元素,這樣-就可以算進(jìn)去。

關(guān)于(+(-的處理:
每次遇到+/-的時(shí)候判斷前一個(gè)字符是否是(,如果是就往nums中添加0。

關(guān)于空格的處理:
這里不能遇到空格后跳過,因?yàn)榭赡艹霈F(xiàn)"1-( -2)"這種情況,所以先預(yù)處理字符串把空格全部消掉。

代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-498620.html

class Solution {
public:
    stack<int> nums;
    stack<char> ops;

    unordered_map<char, function<int(int, int)>> hash = {
        {'+', [](int x, int y){return x + y;}},
        {'-', [](int x, int y){return x - y;}},
    };

    void delBlack(string& s)
    {
        auto it = s.find(" ");
        while(it != -1)
        {
            s.replace(it, 1, "");
            it = s.find(" ");
        }
    }

    void calc()
    {
        if(nums.size() < 2 || ops.empty()) return;
        int right = nums.top();
        nums.pop();
        int left = nums.top();
        nums.pop();
        char op = ops.top();
        ops.pop();
        nums.push(hash[op](left, right));
    }
    
    int calculate(string s) {
        // 去掉空格
        delBlack(s);
        // 防止首元素為-
        nums.push(0);
        int n = s.size();
        for(int i = 0; i < n; i++)
        {
            if(isdigit(s[i]))// 數(shù)字字符
            {
                int cur = 0, j = i;
                while(j < n && isdigit(s[j]))
                {
                    cur = cur * 10 + (s[j++] - '0');
                }
                nums.push(cur);
                i = j - 1;
            }
            else// 符號(hào)字符
            {
                if(s[i] == '(') ops.push(s[i]);
                else if(hash.count(s[i]))// + -
                {
                    // "(+"情況
                    if (i > 0 && (s[i - 1] == '(')) 
                    {
                        nums.push(0);
                    }
                    // 入棧前先把前面的計(jì)算了
                    while(ops.size() && ops.top() != '(')
                    {
                        calc();
                    }
                    ops.push(s[i]);
                }
                else// ')'
                {
                    // 一直算到 '('
                    while(ops.size() && ops.top() != '(')
                    {
                        calc();
                    }
                    ops.pop();
                }
            }
        }
        while(!ops.empty())
            calc();
        return nums.top();
    }
};

二、基本計(jì)算器Ⅱ

題目鏈接

題目描述:

給你一個(gè)字符串表達(dá)式 s ,請(qǐng)你實(shí)現(xiàn)一個(gè)基本計(jì)算器來計(jì)算并返回它的值。
整數(shù)除法僅保留整數(shù)部分。
你可以假設(shè)給定的表達(dá)式總是有效的。所有中間結(jié)果將在 [-231, 231 - 1] 的范圍內(nèi)。
注意:不允許使用任何將字符串作為數(shù)學(xué)表達(dá)式計(jì)算的內(nèi)置函數(shù),比如 eval() 。

示例 1:

輸入:s = “3+2*2”
輸出:7

示例 2:

輸入:s = " 3/2 "
輸出:1

示例 3:

輸入:s = " 3+5 / 2 "
輸出:5

提示:

1 <= s.length <= 3 * 105
s 由整數(shù)和算符 (‘+’, ‘-’, ‘*’, ‘/’) 組成,中間由一些空格隔開
s 表示一個(gè) 有效表達(dá)式
表達(dá)式中的所有整數(shù)都是非負(fù)整數(shù),且在范圍 [0, 231 - 1] 內(nèi)
題目數(shù)據(jù)保證答案是一個(gè) 32-bit 整數(shù)

思路分析:
這道題跟上面一道題多了一個(gè)符號(hào)優(yōu)先級(jí)問題,為了解決這個(gè)問題,可以加入一個(gè)符號(hào)優(yōu)先級(jí)表:

unordered_map<char,int> oper_pri = {
        {'+',1},
        {'-',1},
        {'*',2},
        {'/',2},
};

當(dāng)遇到符號(hào)+ - * /的時(shí)候先判斷優(yōu)先級(jí)oper_pri[ops.top()] >= oper_pri[s[i]]的時(shí)候說明可以計(jì)算前面的表達(dá)式了,先計(jì)算前面的,然后再把符號(hào)添加進(jìn)ops中。

那遇到)也要計(jì)算前面的,需不需要判斷優(yōu)先級(jí)呢?
不需要,因?yàn)樵?code>()內(nèi)部已經(jīng)自動(dòng)處理完了。

代碼如下:

class Solution {
public:
    stack<int> nums;
    stack<char> ops;

    unordered_map<char, function<int(int, int)>> hash = {
        {'+', [](int x, int y){return x + y;}},
        {'-', [](int x, int y){return x - y;}},
        {'*', [](int x, int y){return x * y;}},
        {'/', [](int x, int y){return x / y;}},
    };

    unordered_map<char,int> oper_pri = {
            {'+',1},
            {'-',1},
            {'*',2},
            {'/',2},
    };

    void delBlack(string& s)
    {
        auto it = s.find(" ");
        while(it != -1)
        {
            s.replace(it, 1, "");
            it = s.find(" ");
        }
    }

    void calc()
    {
        if(nums.size() < 2 || ops.empty()) return;
        int right = nums.top();
        nums.pop();
        int left = nums.top();
        nums.pop();
        char op = ops.top();
        ops.pop();
        nums.push(hash[op](left, right));
    }

    int calculate(string s) {
        // 去掉空格
        delBlack(s);
        // 防止首元素為-
        nums.push(0);
        int n = s.size();
        for(int i = 0; i < n; i++)
        {
            if(isdigit(s[i]))// 數(shù)字字符
            {
                int cur = 0, j = i;
                while(j < n && isdigit(s[j]))
                {
                    cur = cur * 10 + (s[j++] - '0');
                }
                nums.push(cur);
                i = j - 1;
            }
            else// 符號(hào)字符
            {
                if(s[i] == '(') ops.push(s[i]);
                else if(hash.count(s[i]))// + - * /
                {
                    // "(+"情況
                    if (i > 0 && (s[i - 1] == '(')) 
                    {
                        nums.push(0);
                    }
                    // 入棧前先把前面的計(jì)算了
                    while(ops.size() && ops.top() != '(' && oper_pri[ops.top()] >= oper_pri[s[i]])
                    {
                        calc();
                    }
                    ops.push(s[i]);
                }
                else// ')'
                {
                    // 一直算到 '('
                    while(ops.size() && ops.top() != '(')
                    {
                        calc();
                    }
                    ops.pop();
                }
            }
        }
        while(!ops.empty())
            calc();
        return nums.top();
    }
};


到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)與算法】雙棧法解決表達(dá)式計(jì)算問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)與算法——二叉樹+帶你實(shí)現(xiàn)表達(dá)式樹(附源碼)

    數(shù)據(jù)結(jié)構(gòu)與算法——二叉樹+帶你實(shí)現(xiàn)表達(dá)式樹(附源碼)

    ??作者介紹:22級(jí)樹莓人(計(jì)算機(jī)專業(yè)),熱愛編程<目前在c++階段, 因?yàn)樽罱鼌⒓有滦怯?jì)劃算法賽道(白佬),所以加快了腳步,果然急迫感會(huì)增加動(dòng)力 ——目標(biāo)Windows,MySQL,Qt,數(shù)據(jù)結(jié)構(gòu)與算法,Linux,多線程,會(huì)持續(xù)分享學(xué)習(xí)成果和小項(xiàng)目的 ??作者主頁:king南星 ??

    2024年01月25日
    瀏覽(18)
  • 數(shù)據(jù)結(jié)構(gòu)——基于二叉樹的表達(dá)式求值算法

    數(shù)據(jù)結(jié)構(gòu)——基于二叉樹的表達(dá)式求值算法

    1.輸入一個(gè)表達(dá)式(表達(dá)式中的數(shù)均小于10的正整數(shù)),利用二叉樹來表示該表達(dá)式,創(chuàng)建表達(dá)式數(shù),然后利用二叉樹的遍歷操作求表達(dá)式的值。 2.輸入要求:多組數(shù)據(jù),每組數(shù)據(jù)1行,為一個(gè)表達(dá)式,表達(dá)式以“=”結(jié)尾。當(dāng)輸入只有一個(gè)“=”時(shí),輸入結(jié)束。 3.輸出要求:每組

    2024年02月04日
    瀏覽(20)
  • 【夜深人靜學(xué)數(shù)據(jù)結(jié)構(gòu)與算法 | 第二篇】后綴(逆波蘭)表達(dá)式

    【夜深人靜學(xué)數(shù)據(jù)結(jié)構(gòu)與算法 | 第二篇】后綴(逆波蘭)表達(dá)式

    目錄 前言:? 中綴表達(dá)式: ?后綴表達(dá)式: 中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式: 后綴表達(dá)式計(jì)算結(jié)果: 總結(jié):? 計(jì)算機(jī)在計(jì)算四則運(yùn)算的時(shí)候,由于括號(hào)以及運(yùn)算優(yōu)先級(jí)的存在,并不能夠很好的處理所有的運(yùn)算,為了處理這種情況,我們引入了后綴表達(dá)式來優(yōu)化算法。 ????? ??

    2024年02月13日
    瀏覽(34)
  • 北京林業(yè)大學(xué)數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)二 基于棧的算術(shù)表達(dá)式求值算法
  • C語言 / 數(shù)據(jù)結(jié)構(gòu)中出現(xiàn)報(bào)錯(cuò): 表達(dá)式必須包含算數(shù)或指針類型,但他具有類型 “XXX” 。 報(bào)錯(cuò)問題的解決 以及 方法

    C語言 / 數(shù)據(jù)結(jié)構(gòu)中出現(xiàn)報(bào)錯(cuò): 表達(dá)式必須包含算數(shù)或指針類型,但他具有類型 “XXX” 。 報(bào)錯(cuò)問題的解決 以及 方法

    前提介紹:L3 是一個(gè)結(jié)構(gòu)體的地址,是一個(gè)指針 ?elem是該結(jié)構(gòu)體內(nèi)的一個(gè)結(jié)構(gòu)體元素,elem是一個(gè)數(shù)組 算數(shù)類型是什么? 下該文章最下面 報(bào)錯(cuò)顯示, 表達(dá)式必須包含 算數(shù) 或 指針類型 , 但elem是一個(gè)數(shù)組,它的類型明顯不是指針類型, 那么elem 的類型本質(zhì)上應(yīng)該就是一個(gè)算

    2024年02月09日
    瀏覽(109)
  • 【算法】遞歸解決各種數(shù)據(jù)結(jié)構(gòu)的遍歷問題

    對(duì)于遞歸算法,我們最先想到的應(yīng)該就是用遞歸的方式去中序遍歷一棵樹,遞歸的使用使得我們可以先深入到下層中,然后慢慢的輸出下層的元素之后輸出上層元素。 因此,基于此,我們甚至可以使用遞歸來逆序輸出一個(gè)棧,鏈表等數(shù)據(jù)結(jié)構(gòu)。 使用遞歸輸出樹 使用遞歸逆序

    2024年02月08日
    瀏覽(17)
  • 數(shù)據(jù)結(jié)構(gòu)之表達(dá)式求值

    數(shù)據(jù)結(jié)構(gòu)之表達(dá)式求值

    ?前言 運(yùn)用堆棧解決表達(dá)式的求值,代碼思路為: 1.定義兩個(gè)棧,一個(gè)char類型的棧用于存放運(yùn)算符(ysf)一個(gè)int類型的棧用于存放操作數(shù)(czs) 如一個(gè)表達(dá)式3+6*9,將“+”,“*”入ysf棧,將“3”“6”“9”入czs棧 2.運(yùn)用getchar進(jìn)行數(shù)據(jù)的錄入,如果接收的是運(yùn)算符,將其插入到運(yùn)

    2024年04月29日
    瀏覽(18)
  • 數(shù)據(jù)結(jié)構(gòu) 實(shí)驗(yàn)2——表達(dá)式求值

    數(shù)據(jù)結(jié)構(gòu) 實(shí)驗(yàn)2——表達(dá)式求值

    一、實(shí)驗(yàn)名稱:表達(dá)式求值 二、實(shí)驗(yàn)學(xué)時(shí): 6 學(xué)時(shí) 三、實(shí)驗(yàn)?zāi)康?1.理解棧的結(jié)構(gòu)特點(diǎn)和基本操作特性; 2.掌握利用棧實(shí)現(xiàn)表達(dá)式求值算法。 四、實(shí)驗(yàn)內(nèi)容 ( 步驟 ) 輸入一個(gè)算術(shù)表達(dá)式(以“=”結(jié)束),求其值。要求表達(dá)式以“=”結(jié)束,操作數(shù)為多位實(shí)數(shù),對(duì)錯(cuò)誤表達(dá)式要進(jìn)行

    2023年04月08日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)】12 堆棧應(yīng)用:表達(dá)式求值

    【數(shù)據(jù)結(jié)構(gòu)】12 堆棧應(yīng)用:表達(dá)式求值

    有一個(gè)常量表達(dá)式的中綴表達(dá)式為:5 + 6 / 2 - 3 * 4,其后綴形式表示為: 5 6 2 / + 3 4 × -。后綴表達(dá)式的特點(diǎn)是運(yùn)算符位于兩個(gè)預(yù)算數(shù)之后。其前綴表達(dá)式為: - + 5 / 6 2 × 3 4。 后綴表達(dá)式相比于中綴表達(dá)式的求值要容易很多。 從左到右掃描該表達(dá)式: (1)遇見運(yùn)算數(shù)5 6 2時(shí)不

    2024年02月20日
    瀏覽(31)
  • 數(shù)據(jù)結(jié)構(gòu) | 棧的中綴表達(dá)式求值

    數(shù)據(jù)結(jié)構(gòu) | 棧的中綴表達(dá)式求值

    目錄 什么是棧? 棧的基本操作 入棧操作 出棧操作 取棧頂元素 中綴表達(dá)式求值 實(shí)現(xiàn)思路 具體代碼 棧是一種線性數(shù)據(jù)結(jié)構(gòu),具有“先進(jìn)后出”(Last In First Out, LIFO)的特點(diǎn)。它可以看作是一種受限的線性表,只能在表的一端進(jìn)行插入和刪除操作,這一端被稱為棧頂,另一端

    2024年02月02日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包