一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何利用棧去實(shí)現(xiàn)一種簡(jiǎn)單計(jì)算器

工程師鄧生 ? 來源:博客園 ? 作者:pdudos ? 2022-09-19 10:32 ? 次閱讀

1. 中綴表達(dá)式 和 后綴表達(dá)式

中綴表達(dá)式: 顧名思義,操作符在操作數(shù)的中間,例如: 1 + 1

后綴表達(dá)式: 指操作符在操作后后面 ,例如 1 1 + , 就代表 中綴表達(dá)式 的 1 + 1

2. 關(guān)于數(shù)據(jù)結(jié)構(gòu): 棧

棧就是一個(gè)先進(jìn)先出的隊(duì)列

C語言函數(shù)之間調(diào)用,就是使用棧進(jìn)行的

3. 中綴表達(dá)式 如何利用棧 轉(zhuǎn)換為后綴表達(dá)式

利用棧轉(zhuǎn)換規(guī)則如下

遍歷中綴表達(dá)式

判斷為數(shù)字直接輸出

判斷為(入棧

判斷為)則,出棧 直至遇到(

判斷為 * 或/

4.1 判斷棧頂元素是否是 * 或/, 如果是 則出棧

4.2 若1不符合規(guī)則,再將這個(gè)字符入棧

5.1 判斷棧頂元素是否是 * 或/,如果是,則全部出棧,然后再入棧

5.2 若1不符合,再將這個(gè)字符入棧

判斷為+-,則

若表達(dá)式計(jì)算完畢,將出棧所有數(shù)據(jù)

實(shí)際例子

通過棧,將式子3+2(9+8)/3(3/5)轉(zhuǎn)換為后綴表達(dá)式

開始式子:3+2*(9+8)/3*(3/5)

開始處理: 3
執(zhí)行規(guī)則1,是數(shù)字直接輸出

輸出:3

:

開始處理: +
執(zhí)行規(guī)則 5.2 直接入棧

輸出:3

:+

開始處理: 2
執(zhí)行規(guī)則1,是數(shù)字直接輸出

輸出:32

:+

開始處理: *
執(zhí)行規(guī)則4.2,直接入棧

輸出:32

:+*

開始處理: (
執(zhí)行規(guī)則2,直接入棧

輸出:32

:+*(

開始處理: 9
執(zhí)行規(guī)則1,直接入棧

輸出:329

:+*(

開始處理: +
執(zhí)行規(guī)則5.2,直接入棧

輸出:329

:+*(+

開始處理: 8
執(zhí)行規(guī)則1,直接入棧

輸出:3298

:+*(+

開始處理: )
執(zhí)行規(guī)則3,出棧直至遇到 (

輸出:3298+

:+*

開始處理: /
執(zhí)行規(guī)則4.1,將棧頂元素為*或/直接出棧,然后在入棧該操作符

輸出:3298+*

:+/

開始處理: 3
執(zhí)行規(guī)則1,直接入棧

輸出:3298+*3

:+/

開始處理: *
執(zhí)行規(guī)則4.1,將棧頂元素為*或/直接出棧,然后在入棧該操作符

輸出:3298+*3/

:+*

開始處理: (
執(zhí)行規(guī)則2,直接入棧

輸出:3298+*3/

:+*(

開始處理: 3
執(zhí)行規(guī)則1,直接入棧

輸出:3298+*3/3

:+*(

開始處理: /
執(zhí)行規(guī)則4.2,入棧

輸出:3298+*3/3

:+*(/

開始處理: 5
執(zhí)行規(guī)則1,直接入棧

輸出:3298+*3/35

:+*(/

開始處理: )
執(zhí)行規(guī)則3,出棧 直至遇到(

輸出:3298+*3/35/

:+*

開始處理: )
執(zhí)行規(guī)則6,全部出棧

輸出:3298+*3/35/*+

:

得到中綴表達(dá)式:3298+*3/35/*+

完畢

轉(zhuǎn)換代碼 C語言實(shí)現(xiàn):

# include 

int main() {
    // 中綴表達(dá)式
    char formula[] = "3+2*(9+8)/3*(3/5)";

    // 棧
    char options[sizeof(formula) * sizeof(char)];
    int stackLen = -1;
    
    printf("%s
",formula);

    int i;
    for (i = 0; formula[i]!='?'; i++) {
        // 規(guī)則1
        if (formula[i] >= '0' && formula[i] <= '9') {
            printf("%c",formula[i]);
        }

        switch (formula[i]) {
            // 規(guī)則2
            case '(': {
                stackLen += 1;
                options[stackLen] =formula[i];
                break;
            }

            // 規(guī)則3
            case ')': {
                while (stackLen >= 0 &&  (options[stackLen] != '(')) {
                    printf("%c",options[stackLen]);
                    stackLen -= 1;
                }
                stackLen-=1;
                break;
            }

            // 規(guī)則4
            case '*':
            case '/': {
                while (stackLen >= 0 && (options[stackLen] == '*' || options[stackLen] == '/')) {
                    printf("%c",options[stackLen]);
                    stackLen -= 1;
                }
                stackLen += 1;
                options[stackLen] = formula[i];
                break;
            }

            // 規(guī)則5
            case '+': 
            case '-': {
                if (stackLen >= 0 &&  (options[stackLen] == '*' || options[stackLen] == '/')) {
                    while (stackLen >= 0) {
                        printf("%c",options[stackLen]);
                        stackLen -= 1;
                    }
                }
                stackLen += 1;
                options[stackLen] = formula[i];
                break;
            }
        }
    }

    // 規(guī)則6 
    while (stackLen >= 0) {
        printf("%c",options[stackLen]);
        stackLen--;
    }

    printf("
");
}

執(zhí)行結(jié)果

# gcc calTest1.c
# ./a.out
3+2*(9+8)/3*(3/5)
3298+*3/35/*+
#

4. 利用棧 后綴表達(dá)式計(jì)算結(jié)果

利用棧計(jì)算后綴表達(dá)式規(guī)則如下

假設(shè)后綴表達(dá)式是有效的

遍歷后綴表達(dá)式

判斷為數(shù)字,則進(jìn)行壓棧

判斷為操作符(+ - * /)

2.1 出棧2個(gè)元素,m 和 n (對(duì)于當(dāng)前棧而言,m: 棧頂元素 n: 棧頂?shù)诙€(gè)元素)

2.2 計(jì)算 n操作符m ,然后將結(jié)果 入棧

實(shí)際例子

通過棧,將計(jì)算后綴表達(dá)式3298+*3/35/*+的值

式子:3298+*3/35/*+

開始處理: 3

執(zhí)行規(guī)則1: 直接入棧

:3

開始處理: 2

執(zhí)行規(guī)則1: 直接入棧

:3 2

開始處理: 9

執(zhí)行規(guī)則1: 直接入棧

:3 2 9

開始處理: 8

執(zhí)行規(guī)則1: 直接入棧

:3 2 9 8

開始處理: +

執(zhí)行規(guī)則2: 取出2個(gè)元素,m:8 n:9, 并且執(zhí)行結(jié)果(n + m)入棧

:3 2 17

開始處理: *

執(zhí)行規(guī)則2: 取出2個(gè)元素,m:17 n:2, 并且執(zhí)行結(jié)果(n * m)入棧

:3 34

開始處理: 3

執(zhí)行規(guī)則1: 直接入棧

:3 34 3

開始處理: /

執(zhí)行規(guī)則2: 取出2個(gè)元素,m:3 n:34, 并且執(zhí)行結(jié)果(n / m)入棧

:3 11.3

開始處理: 3

執(zhí)行規(guī)則1: 直接入棧

:3 11.3 3

開始處理: 5

執(zhí)行規(guī)則1: 直接入棧

:3 11.3 3 5

開始處理: /

執(zhí)行規(guī)則2: 取出2個(gè)元素,m:5 n:3, 并且執(zhí)行結(jié)果(n / m)入棧

:3 11.3 0.6

開始處理: *

執(zhí)行規(guī)則2: 取出2個(gè)元素,m:0.6 n:11.3, 并且執(zhí)行結(jié)果(n * m)入棧

:3 6.8

開始處理: +

執(zhí)行規(guī)則2: 取出2個(gè)元素,m:6.8 n:3, 并且執(zhí)行結(jié)果(n + m)入棧

:9.8

計(jì)算結(jié)果:9.8

完成

用C實(shí)現(xiàn)該代碼

轉(zhuǎn)換代碼 C語言實(shí)現(xiàn):

# include 

int main() {
    // 后綴表達(dá)式
    char formula[] = "3298+*3/35/*+";

    // 棧
    float options[sizeof(formula) * sizeof(char)];
    int stackLen = -1;
    
    printf("%s
",formula);

    int i;
    for(i=0;formula[i]!='?';i++) {
        // 規(guī)則1
        if (formula[i] >= '0' && formula[i] <= '9') {
            stackLen++;
            options[stackLen] = (float)(formula[i]-48);
        } else {
            // 規(guī)則2
            float m = options[stackLen];
            stackLen--;

            float n = options[stackLen];
            stackLen--;

            switch (formula[i]) {
                case '*': {
                     stackLen++;
                     options[stackLen] = (n * m);
                     break;
                }
                case '/': {
                     stackLen++;
                     options[stackLen] = (n / m);
                     break;
                }
                case '+': {
                     stackLen++;
                     options[stackLen] = (n + m);
                     break;
                }
                case '-': {
                     stackLen++;
                     options[stackLen] = (n - m);
                     break;
                }
            }
        }
    }

    printf("
結(jié)果為: %.2f
" , options[0]);
}

執(zhí)行結(jié)果

# ./a.out
3298+*3/35/*+

結(jié)果為: 9.80
#



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7628

    瀏覽量

    139830
  • 計(jì)算器
    +關(guān)注

    關(guān)注

    16

    文章

    439

    瀏覽量

    37819

原文標(biāo)題:利用棧實(shí)現(xiàn)計(jì)算器,實(shí)戰(zhàn)挺好

文章出處:【微信號(hào):技術(shù)讓夢(mèng)想更偉大,微信公眾號(hào):技術(shù)讓夢(mèng)想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    VirtualLab Fusion應(yīng)用:相干時(shí)間和相干長度計(jì)算器

    摘要 在本用例中,我們介紹了一種計(jì)算器,它可以根據(jù)給定光源的波譜信息快速估計(jì)其時(shí)間相干特性。然后,可以將該計(jì)算器的結(jié)果自動(dòng)復(fù)制到通用探測(cè)中,以便在考慮時(shí)間相干性時(shí)應(yīng)用近似方法,而無
    發(fā)表于 04-08 08:48

    VirtualLab:衍射角計(jì)算器

    可以通過“開始”選項(xiàng)卡下的“計(jì)算器”下拉列表訪問“衍射角計(jì)算器”。 設(shè)置輸入?yún)?shù) 用戶需要輸入光柵周期、入射角、波長的值,并定義光柵前后的材料。入射波和反射級(jí)次位于第一種材料中,而透射級(jí)次于第二
    發(fā)表于 04-08 08:46

    利用結(jié)構(gòu)實(shí)現(xiàn)四則運(yùn)算的巧妙方法

    上個(gè)視頻寫了個(gè)簡(jiǎn)易計(jì)算器,算個(gè)簡(jiǎn)單的加減乘除還行,但是如果來個(gè)混合運(yùn)算,或者加個(gè)括號(hào),這幾行代碼就差的太多了。 處理這種混合運(yùn)算,不得不提到數(shù)據(jù)結(jié)構(gòu)中的。 我們平時(shí)寫的這種表達(dá)式,叫做中綴表達(dá)式
    的頭像 發(fā)表于 02-07 11:06 ?384次閱讀

    VirtualLab Fusion應(yīng)用:相干時(shí)間和相干長度計(jì)算器

    摘要 在本用例中,我們介紹了一種計(jì)算器,它可以根據(jù)給定光源的波譜信息快速估計(jì)其時(shí)間相干特性。然后,可以將該計(jì)算器的結(jié)果自動(dòng)復(fù)制到通用探測(cè)中,以便在考慮時(shí)間相干性時(shí)應(yīng)用近似方法,而無需
    發(fā)表于 12-27 08:48

    Debye-Wolf積分計(jì)算器的用法

    即可進(jìn)行計(jì)算。 該案例將說明如何在VirtualLab中使用Debye-Wolf積分計(jì)算器。 **建模任務(wù) ** 開啟Debye-Wolf積分計(jì)算器 ?我們直接單擊計(jì)算器,然后選擇D
    發(fā)表于 12-26 08:59

    LP光纖模式計(jì)算器

    :漸變折射率 (GRIN) 光纖 光纖模式計(jì)算器允許定義線性偏振貝塞爾模式和線性偏振拉蓋爾模式。 對(duì)于 GRIN 光纖,定義了梯度常數(shù)。 然后通過下式計(jì)算折射率 與前一種情況樣,
    發(fā)表于 12-18 13:36

    一種使用LDO簡(jiǎn)單電源電路解決方案

    本期我們介紹一種使用LDO簡(jiǎn)單電源電路解決方案,該方案可以處理12V/24V、多節(jié)鋰離子電池和4節(jié)干電池等相對(duì)較高的輸入電壓。
    的頭像 發(fā)表于 12-04 16:05 ?669次閱讀
    <b class='flag-5'>一種</b>使用LDO<b class='flag-5'>簡(jiǎn)單</b>電源電路解決方案

    使用DRV421進(jìn)行設(shè)計(jì):系統(tǒng)參數(shù)計(jì)算器

    電子發(fā)燒友網(wǎng)站提供《使用DRV421進(jìn)行設(shè)計(jì):系統(tǒng)參數(shù)計(jì)算器.pdf》資料免費(fèi)下載
    發(fā)表于 10-26 09:52 ?1次下載
    使用DRV421進(jìn)行設(shè)計(jì):系統(tǒng)參數(shù)<b class='flag-5'>計(jì)算器</b>

    一種利用CSD16327Q3實(shí)現(xiàn)企業(yè)固態(tài)硬盤鉭電容短路保護(hù)的方法

    電子發(fā)燒友網(wǎng)站提供《一種利用CSD16327Q3實(shí)現(xiàn)企業(yè)固態(tài)硬盤鉭電容短路保護(hù)的方法.pdf》資料免費(fèi)下載
    發(fā)表于 10-25 10:22 ?0次下載
    <b class='flag-5'>一種</b><b class='flag-5'>利用</b>CSD16327Q3<b class='flag-5'>實(shí)現(xiàn)</b>企業(yè)固態(tài)硬盤鉭電容短路保護(hù)的方法

    一種簡(jiǎn)單高效配置FPGA的方法

    本文描述了一種簡(jiǎn)單高效配置FPGA的方法,該方法利用微處理從串行外圍接口(SPI)閃存配置FPGA設(shè)備。這種方法減少了硬件組件、板空間和成本。
    的頭像 發(fā)表于 10-24 14:57 ?1262次閱讀
    <b class='flag-5'>一種</b><b class='flag-5'>簡(jiǎn)單</b>高效配置FPGA的方法

    基于FPGA的計(jì)算器設(shè)計(jì)

    本文通過FPGA實(shí)現(xiàn)8位十進(jìn)制數(shù)的加、減、乘、除運(yùn)算,通過矩陣鍵盤輸入數(shù)據(jù)和運(yùn)算符,矩陣鍵盤的布局圖如下所示。該計(jì)算器可以進(jìn)行連續(xù)運(yùn)算,當(dāng)按下等號(hào)后,可以直接按數(shù)字進(jìn)行下次運(yùn)算,或者按運(yùn)算符,把上次運(yùn)算結(jié)果作為本次運(yùn)算的第個(gè)操
    的頭像 發(fā)表于 10-24 14:28 ?1004次閱讀
    基于FPGA的<b class='flag-5'>計(jì)算器</b>設(shè)計(jì)

    CAN位時(shí)序參數(shù)計(jì)算器

    電子發(fā)燒友網(wǎng)站提供《CAN位時(shí)序參數(shù)計(jì)算器.pdf》資料免費(fèi)下載
    發(fā)表于 10-11 09:55 ?1次下載
    CAN位時(shí)序參數(shù)<b class='flag-5'>計(jì)算器</b>

    一種利用wireshark對(duì)遠(yuǎn)程服務(wù)/路由網(wǎng)絡(luò)抓包方法

    一種利用wireshark對(duì)遠(yuǎn)程服務(wù)/路由網(wǎng)絡(luò)抓包方法
    的頭像 發(fā)表于 09-21 08:03 ?4345次閱讀
    <b class='flag-5'>一種</b><b class='flag-5'>利用</b>wireshark對(duì)遠(yuǎn)程服務(wù)<b class='flag-5'>器</b>/路由<b class='flag-5'>器</b>網(wǎng)絡(luò)抓包方法

    色環(huán)電阻計(jì)算器的研究與應(yīng)用

    個(gè)理想的色環(huán)電阻計(jì)算器的界面應(yīng)該包含個(gè)顏色選擇,讓用戶能夠通過點(diǎn)擊或下拉菜單選擇各個(gè)顏色環(huán)。而在程序邏輯層面,計(jì)算器需要具備實(shí)時(shí)反饋功
    的頭像 發(fā)表于 09-18 13:45 ?700次閱讀

    平平無奇計(jì)算器:520能對(duì)你說多少次?

    5月是個(gè)愛人愛己愛勞動(dòng)的月份剛剛過去的5月20日小滿遇見520,人生小滿勝萬全情侶們說“愛意恰逢其時(shí)”計(jì)算器對(duì)小白說“520”……噠噠噠本期測(cè)評(píng)產(chǎn)品為:簡(jiǎn)易計(jì)算器計(jì)算器對(duì)我說無數(shù)次
    的頭像 發(fā)表于 05-25 08:04 ?1086次閱讀
    平平無奇<b class='flag-5'>計(jì)算器</b>:520能對(duì)你說多少次?