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

算法通過村第四關(guān)-棧黃金筆記|表達(dá)式問題

這篇具有很好參考價(jià)值的文章主要介紹了算法通過村第四關(guān)-棧黃金筆記|表達(dá)式問題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


前言


提示:快樂的人沒有過去,不快樂的人除了過去一無所有。 --理查德·弗蘭納根《深入北方的小路》

棧的進(jìn)階來了,還記得棧的使用場(chǎng)景嗎?表達(dá)式和符號(hào),這不就來了

1. 計(jì)算器問題

參考題目介紹:227. 基本計(jì)算器 II - 力扣(LeetCode)
算法通過村第四關(guān)-棧黃金筆記|表達(dá)式問題,算法集訓(xùn)營,算法,筆記,棧,數(shù)據(jù)結(jié)構(gòu),leetcode,逆波蘭表達(dá)式,表達(dá)式問題
算法通過村第四關(guān)-棧黃金筆記|表達(dá)式問題,算法集訓(xùn)營,算法,筆記,棧,數(shù)據(jù)結(jié)構(gòu),leetcode,逆波蘭表達(dá)式,表達(dá)式問題
計(jì)算問題在棧的運(yùn)用也是非常廣泛的。在乘除優(yōu)先于加減計(jì)算,我們需要考慮所有的乘除運(yùn)算,并將這些乘除運(yùn)算后的整數(shù)放回原來對(duì)應(yīng)的表達(dá)式中,隨后整個(gè)表達(dá)式的值等于一系列整數(shù)加減后的運(yùn)算值。

基于這樣的想法,我們可以使用的們的老朋友棧了,保存這些(進(jìn)行乘除運(yùn)算后的)整數(shù)值。對(duì)于加減后的數(shù)字,將其直接壓入棧中,對(duì)于乘除后的數(shù)字,我可以直接與棧頂元素計(jì)算,并替換棧頂元素作為計(jì)算后的結(jié)果。

具體來說,我們遍歷字符串s,并用變量preSign來記錄每個(gè)數(shù)字之前的運(yùn)算符,對(duì)于第一個(gè)數(shù)字,其之前的運(yùn)算符視為加號(hào)。每次遍歷到數(shù)組的末尾時(shí),根據(jù)preSign來決定計(jì)算方式

  • 加號(hào):將數(shù)字壓入棧中
  • 減號(hào):將數(shù)字的相反數(shù)壓入棧中
  • 乘除號(hào):計(jì)算數(shù)字與棧頂元素,并將棧頂元素替換為計(jì)算結(jié)果。

代碼實(shí)現(xiàn)中,讀到一個(gè)運(yùn)算符,或者遍歷到字符串末尾,,就認(rèn)為遍歷到了數(shù)字末尾。處理完該數(shù)字后,更新preSign為當(dāng)前遍歷的字符。遍歷完字符串s后,將棧中的元素累加,即為該表達(dá)式的結(jié)果。

	 /**
     * 實(shí)現(xiàn)計(jì)算器問題
     * @param s
     * @return
     */
    public static int calculate(String s) {
        Deque<Integer> stack = new ArrayDeque<Integer>();
        // 計(jì)算可以都看做時(shí) +   這里是前一個(gè)符號(hào)
        Character preSign = '+';
        int num = 0;
        int n = s.length();
        for (int i = 0; i < n; i++) {
            if (Character.isDigit(s.charAt(i))) {
                // 字符轉(zhuǎn)數(shù)字  考慮到大于10 的情況
                num = num * 10 + s.charAt(i) - '0';
            }
            if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == n - 1) {
                switch (preSign) {
                    case '+':
                        stack.push(num);
                        break;
                    case '-':
                        stack.push(-num);
                        break;
                    case '*': // 5 * 2
                        stack.push(stack.pop() * num);
                        break;
                    case '/':  // 10 / 2
                        stack.push(stack.pop() / num);
                        break;
                    default:
                        break;
                }
                // 更新前一個(gè)符號(hào)   這樣就可以確定乘除優(yōu)先了
                preSign = s.charAt(i);
                num = 0;
            }
        }
        int ans = 0;
        while(!stack.isEmpty()){
            ans += stack.pop();
        }
        return ans;
    }

注意:

  • perSign 指的是前一個(gè)運(yùn)算符號(hào)(首次默認(rèn)看作是+號(hào))

  • 慢一次計(jì)算 就可以確保乘除優(yōu)先了

2. 逆波蘭表達(dá)式問題

參考題目介紹:150. 逆波蘭表達(dá)式求值 - 力扣(LeetCode)
算法通過村第四關(guān)-棧黃金筆記|表達(dá)式問題,算法集訓(xùn)營,算法,筆記,棧,數(shù)據(jù)結(jié)構(gòu),leetcode,逆波蘭表達(dá)式,表達(dá)式問題
算法通過村第四關(guān)-棧黃金筆記|表達(dá)式問題,算法集訓(xùn)營,算法,筆記,棧,數(shù)據(jù)結(jié)構(gòu),leetcode,逆波蘭表達(dá)式,表達(dá)式問題
說實(shí)話這個(gè)題頗有難度,可以放在學(xué)習(xí)完二叉樹再來看??

表達(dá)式計(jì)算式編譯原理,自然語言處理,文本分析等領(lǐng)域非??粗氐膯栴},這里我們就挑這個(gè)題目練手,逆波蘭表達(dá)式。

這道題看似困難,實(shí)則真困難吶,你要是不知道什么是表達(dá)式,完了,你不會(huì)了。這里的表達(dá)式就好比一起上小學(xué)學(xué)的(2+1)* 3這樣字的,根據(jù)不同的記法,就有前綴,中綴,后綴之說,區(qū)別呢在于運(yùn)算符號(hào)相對(duì)于操作數(shù)的位置,前綴就是運(yùn)算符號(hào)在操作數(shù)前面,那后綴和中綴呢?你想想?

??聰明講個(gè)笑話:

有一天,一只螞蟻遇到了一只蝸牛。螞蟻問蝸牛:“為什么我們走路的時(shí)候總是把頭抬得那么高?”蝸牛回答:“因?yàn)槲覀兊哪繕?biāo)在地上。”

算法通過村第四關(guān)-棧黃金筆記|表達(dá)式問題,算法集訓(xùn)營,算法,筆記,棧,數(shù)據(jù)結(jié)構(gòu),leetcode,逆波蘭表達(dá)式,表達(dá)式問題
對(duì)應(yīng)的三種表達(dá)式:

中綴表達(dá)式:( 1 + 2* 3
前綴表達(dá)式: + 1 2 * 3
后綴表達(dá)式: 1 2 + 3 *

從上面看,中綴的表達(dá)式更像是我們常見的,它作為一種通用的算數(shù)運(yùn)算和邏輯公式表示,操作符以中綴形式處于操作數(shù)的中間。雖然我們的大腦很容易就可以理解這些分析最終拿到結(jié)果,但是對(duì)于計(jì)算機(jī)來說,就很頭疼了,計(jì)算機(jī)在做表達(dá)式計(jì)算的時(shí)候,通常是需要將中綴表達(dá)式轉(zhuǎn)換為前綴或者后綴表達(dá)式再進(jìn)行求值的。前綴表達(dá)式的運(yùn)算符位于兩個(gè)相應(yīng)操作數(shù)之前,前綴表達(dá)式又被稱為前綴記法或者波蘭是,而后綴表達(dá)式就是你波蘭式了。

觀察后我們就可以看出,根據(jù)特點(diǎn)將數(shù)字保存下來,遇到符號(hào)就計(jì)算。比如:1 2 + 3 * 遇到+ ,我們就好1 和 2 加起來,得到結(jié)果 3 然后在進(jìn)行計(jì)算 得到結(jié)果 9 .

這樣得話之不是容易一些,遇到數(shù)字就進(jìn)棧,遇到運(yùn)算符就取出棧中的最上面的兩個(gè)元素進(jìn)行計(jì)算,最后再將結(jié)果入棧。實(shí)現(xiàn)代碼會(huì)不會(huì)簡(jiǎn)單一些:

public class EvalRPN {
    public static int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<Integer>();
        for (String token : tokens) {
            if (!Character.isDigit(token.charAt(0)) && token.length() == 1) {
                // 取出棧頂?shù)臄?shù)字
                int a = stack.pop();
                int b = stack.pop();
                // 做運(yùn)算
                switch (token) {
                    case "+":   // a b +
                        stack.push(a + b);
                        break;
                    case "-": // a b -
                        stack.push(a - b);
                        break;
                    case "*": // a b *
                        stack.push(a * b);
                        break;
                    case "/": // a b /
                        stack.push(a / b);
                        break;
                    default:
                        break;
                }
            }else {
                // 直接存入棧中
                stack.push(Integer.parseInt(token));
            }
        }
        return  stack.pop();
    }

總結(jié)

提示:棧的運(yùn)用,表達(dá)式策略,逆波蘭。文章來源地址http://www.zghlxwxcb.cn/news/detail-689350.html

到了這里,關(guān)于算法通過村第四關(guān)-棧黃金筆記|表達(dá)式問題的文章就介紹完了。如果您還想了解更多內(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)文章

  • 【代碼隨想錄-Leetcode第四題:150. 逆波蘭表達(dá)式求值】

    給你一個(gè)字符串?dāng)?shù)組 tokens ,表示一個(gè)根據(jù) 逆波蘭表示法 表示的算術(shù)表達(dá)式。 請(qǐng)你計(jì)算該表達(dá)式。返回一個(gè)表示表達(dá)式值的整數(shù)。 注意: 有效的算符為 ‘+’、‘-’、‘*’ 和 ‘/’ 。 每個(gè)操作數(shù)(運(yùn)算對(duì)象)都可以是一個(gè)整數(shù)或者另一個(gè)表達(dá)式。 兩個(gè)整數(shù)之間的除法總

    2024年02月13日
    瀏覽(20)
  • 小白到運(yùn)維工程師自學(xué)之路 第四十九集 (正則表達(dá)式之grep)

    小白到運(yùn)維工程師自學(xué)之路 第四十九集 (正則表達(dá)式之grep)

    1、正則表達(dá)式(Regular Expression,簡(jiǎn)稱為RegExp或Regex)是一種用于描述、匹配和操作文本的字符串模式的表達(dá)式。它提供了一種強(qiáng)大而靈活的方式來進(jìn)行字符串的搜索、替換、提取和驗(yàn)證操作。 2、正則表達(dá)式可以用于各種編程語言和應(yīng)用程序中,包括文本編輯器、命令行工具

    2024年02月13日
    瀏覽(26)
  • Golang通過棧實(shí)現(xiàn)表達(dá)式運(yùn)算(中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式解析語法)

    需求背景:將string表達(dá)式數(shù)組 [title == AUSU ( header == Wecome || brand != AC68U )] 解析并使用ES查詢得到運(yùn)算結(jié)果。 分析:帶有括號(hào)的表達(dá)式,需要根據(jù)優(yōu)先級(jí)解析,可將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式,去除括號(hào)

    2024年02月14日
    瀏覽(25)
  • 【sqli靶場(chǎng)】第四關(guān)和第五關(guān)通關(guān)思路

    【sqli靶場(chǎng)】第四關(guān)和第五關(guān)通關(guān)思路

    目錄 前言 一、sqli靶場(chǎng)第四關(guān) 1.1 判斷注入類型 1.2 觀察報(bào)錯(cuò)?? 1.3?判斷數(shù)據(jù)表中的列數(shù) 1.4?使用union聯(lián)合查詢 1.5 使用group_concat()函數(shù) 二、sqli靶場(chǎng)第五關(guān) 2.1 判斷注入類型 2.2 使用extractvalue函數(shù)報(bào)錯(cuò) 2.3 爆出數(shù)據(jù)庫中的表名 2.4?爆出users表中的列名 2.5 爆出users表中的數(shù)據(jù) ??嗨

    2024年01月24日
    瀏覽(12)
  • java通過正則表達(dá)式提取信息

    java通過正則表達(dá)式提取信息

    工具類如下 使用以及結(jié)果 下面這個(gè)即為data的原文 結(jié)果 推薦這個(gè)網(wǎng)站,看起來更直觀 正則在線 真正比較難的事兒吧,是怎么寫這個(gè)正則表達(dá)式 有的表達(dá)式不是不能用,只是在java程序中不好用,怎么辦呢,推薦用chatgpt吧,讓他來幫你寫表達(dá)式 第一步,先把文案發(fā)出去 第二

    2024年02月16日
    瀏覽(25)
  • Notepad++工具通過正則表達(dá)式批量替換內(nèi)容

    Notepad++工具通過正則表達(dá)式批量替換內(nèi)容

    Ctrl+H彈出小窗口;查找目標(biāo)輸入$,替換為輸入特定字符串;選中循環(huán)查找,查找模式選正則表達(dá)式;最后點(diǎn)擊全部替換 Ctrl+H彈出小窗口;查找目標(biāo)輸入^,替換為輸入特定字符串;選中循環(huán)查找,查找模式選正則表達(dá)式;最后點(diǎn)擊全部替換 Ctrl+H彈出小窗口;查找目標(biāo)輸入 相

    2024年02月15日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】【12】前綴表達(dá)式、中綴表達(dá)式、后綴表達(dá)式

    【數(shù)據(jù)結(jié)構(gòu)與算法】【12】前綴表達(dá)式、中綴表達(dá)式、后綴表達(dá)式

    什么是前綴表達(dá)式、中綴表達(dá)式、后綴表達(dá)式 前綴表達(dá)式、中綴表達(dá)式、后綴表達(dá)式,是通過樹來存儲(chǔ)和計(jì)算表達(dá)式的三種不同方式 以如下公式為例 ( a + ( b ? c ) ) ? d ( a+(b-c) )*d ( a + ( b ? c ) ) ? d 通過樹來存儲(chǔ)該公式,可以表示為 那么問題就來了,樹只是一種抽象的數(shù)據(jù)

    2024年02月08日
    瀏覽(22)
  • Java通過Lambda表達(dá)式根據(jù)指定字段去除重復(fù)數(shù)據(jù)(集合去重)

    Java通過Lambda表達(dá)式根據(jù)指定字段去除重復(fù)數(shù)據(jù)(集合去重)

    這里博主給大家封裝好了一個(gè)工具類,里面有兩個(gè)方法。 方法一:可以根據(jù)指定字段去除重復(fù)數(shù)據(jù)。 方法二:可以獲取到重復(fù)的數(shù)據(jù)。 大家在使用過程中直接拷貝下方代碼在要去重的類中調(diào)用即可。 導(dǎo)入這個(gè)工具類后怎么使用呢?我們接著往下看。 List rstList = list.stream()

    2024年02月16日
    瀏覽(98)
  • 【Python小技巧】通過實(shí)例說明推導(dǎo)式,條件表達(dá)式和Lambda函數(shù)

    按照國際慣例,首先聲明:本文只是我自己學(xué)習(xí)的理解,雖然參考了他人的寶貴見解及成果,但是內(nèi)容可能存在不準(zhǔn)確的地方。如果發(fā)現(xiàn)文中錯(cuò)誤,希望批評(píng)指正,共同進(jìn)步。 本文總結(jié)在Python編程中會(huì)使用到的三個(gè)(高階)小技巧:推導(dǎo)式,條件表達(dá)式和Lambda函數(shù),并通過實(shí)

    2024年03月27日
    瀏覽(23)
  • 學(xué)習(xí)筆記-正則表達(dá)式

    https://www.runoob.com/regexp/regexp-tutorial.html 正則表達(dá)式re(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為\\\"元字符\\\"),可以用來描述和匹配字符串的特定模式。 個(gè)人理解,re是對(duì)字符序列進(jìn)行建模,建立多對(duì)一映射,能夠覆蓋所有字符

    2024年02月09日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包