女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何利用棧去實現一種簡單計算器

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

1. 中綴表達式 和 后綴表達式

中綴表達式: 顧名思義,操作符在操作數的中間,例如: 1 + 1

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

2. 關于數據結構: 棧

棧就是一個先進先出的隊列

C語言函數之間調用,就是使用棧進行的

3. 中綴表達式 如何利用棧 轉換為后綴表達式

利用棧轉換規則如下

遍歷中綴表達式

判斷為數字直接輸出

判斷為(入棧

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

判斷為 * 或/

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

4.2 若1不符合規則,再將這個字符入棧

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

5.2 若1不符合,再將這個字符入棧

判斷為+-,則

若表達式計算完畢,將出棧所有數據

實際例子

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

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

開始處理: 3
執行規則1,是數字直接輸出

輸出:3

:

開始處理: +
執行規則 5.2 直接入棧

輸出:3

:+

開始處理: 2
執行規則1,是數字直接輸出

輸出:32

:+

開始處理: *
執行規則4.2,直接入棧

輸出:32

:+*

開始處理: (
執行規則2,直接入棧

輸出:32

:+*(

開始處理: 9
執行規則1,直接入棧

輸出:329

:+*(

開始處理: +
執行規則5.2,直接入棧

輸出:329

:+*(+

開始處理: 8
執行規則1,直接入棧

輸出:3298

:+*(+

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

輸出:3298+

:+*

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

輸出:3298+*

:+/

開始處理: 3
執行規則1,直接入棧

輸出:3298+*3

:+/

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

輸出:3298+*3/

:+*

開始處理: (
執行規則2,直接入棧

輸出:3298+*3/

:+*(

開始處理: 3
執行規則1,直接入棧

輸出:3298+*3/3

:+*(

開始處理: /
執行規則4.2,入棧

輸出:3298+*3/3

:+*(/

開始處理: 5
執行規則1,直接入棧

輸出:3298+*3/35

:+*(/

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

輸出:3298+*3/35/

:+*

開始處理: )
執行規則6,全部出棧

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

:

得到中綴表達式:3298+*3/35/*+

完畢

轉換代碼 C語言實現:

# include 

int main() {
    // 中綴表達式
    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++) {
        // 規則1
        if (formula[i] >= '0' && formula[i] <= '9') {
            printf("%c",formula[i]);
        }

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

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

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

            // 規則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;
            }
        }
    }

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

    printf("
");
}

執行結果

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

4. 利用棧 后綴表達式計算結果

利用棧計算后綴表達式規則如下

假設后綴表達式是有效的

遍歷后綴表達式

判斷為數字,則進行壓棧

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

2.1 出棧2個元素,m 和 n (對于當前棧而言,m: 棧頂元素 n: 棧頂第二個元素)

2.2 計算 n操作符m ,然后將結果 入棧

實際例子

通過棧,將計算后綴表達式3298+*3/35/*+的值

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

開始處理: 3

執行規則1: 直接入棧

:3

開始處理: 2

執行規則1: 直接入棧

:3 2

開始處理: 9

執行規則1: 直接入棧

:3 2 9

開始處理: 8

執行規則1: 直接入棧

:3 2 9 8

開始處理: +

執行規則2: 取出2個元素,m:8 n:9, 并且執行結果(n + m)入棧

:3 2 17

開始處理: *

執行規則2: 取出2個元素,m:17 n:2, 并且執行結果(n * m)入棧

:3 34

開始處理: 3

執行規則1: 直接入棧

:3 34 3

開始處理: /

執行規則2: 取出2個元素,m:3 n:34, 并且執行結果(n / m)入棧

:3 11.3

開始處理: 3

執行規則1: 直接入棧

:3 11.3 3

開始處理: 5

執行規則1: 直接入棧

:3 11.3 3 5

開始處理: /

執行規則2: 取出2個元素,m:5 n:3, 并且執行結果(n / m)入棧

:3 11.3 0.6

開始處理: *

執行規則2: 取出2個元素,m:0.6 n:11.3, 并且執行結果(n * m)入棧

:3 6.8

開始處理: +

執行規則2: 取出2個元素,m:6.8 n:3, 并且執行結果(n + m)入棧

:9.8

計算結果:9.8

完成

用C實現該代碼

轉換代碼 C語言實現:

# include 

int main() {
    // 后綴表達式
    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++) {
        // 規則1
        if (formula[i] >= '0' && formula[i] <= '9') {
            stackLen++;
            options[stackLen] = (float)(formula[i]-48);
        } else {
            // 規則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("
結果為: %.2f
" , options[0]);
}

執行結果

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

結果為: 9.80
#



審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140262
  • 計算器
    +關注

    關注

    16

    文章

    439

    瀏覽量

    37924

原文標題:利用棧實現計算器,實戰挺好

文章出處:【微信號:技術讓夢想更偉大,微信公眾號:技術讓夢想更偉大】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    VirtualLab Fusion應用:相干時間和相干長度計算器

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

    VirtualLab:衍射角計算器

    可以通過“開始”選項卡下的“計算器”下拉列表訪問“衍射角計算器”。 設置輸入參數 用戶需要輸入光柵周期、入射角、波長的值,并定義光柵前后的材料。入射波和反射級次位于第一種材料中,而透射級次于第二
    發表于 04-08 08:46

    利用結構實現四則運算的巧妙方法

    上個視頻寫了個簡易計算器,算個簡單的加減乘除還行,但是如果來個混合運算,或者加個括號,這幾行代碼就差的太多了。 處理這種混合運算,不得不提到數據結構中的。 我們平時寫的這種表達式,叫做中綴表達式
    的頭像 發表于 02-07 11:06 ?423次閱讀

    VirtualLab Fusion應用:相干時間和相干長度計算器

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

    Debye-Wolf積分計算器的用法

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

    LP光纖模式計算器

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

    一種使用LDO簡單電源電路解決方案

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

    λ-IO:存儲計算下的IO設計

    動機和背景? ? 存儲計算存儲資源的充分利用。IO是管理存儲的的基本組件,包括設備驅動、塊接口層、文件系統,目前些用戶空間IO庫(如S
    的頭像 發表于 12-02 10:35 ?552次閱讀
    λ-IO:存儲<b class='flag-5'>計算</b>下的IO<b class='flag-5'>棧</b>設計

    使用DRV421進行設計:系統參數計算器

    電子發燒友網站提供《使用DRV421進行設計:系統參數計算器.pdf》資料免費下載
    發表于 10-26 09:52 ?1次下載
    使用DRV421進行設計:系統參數<b class='flag-5'>計算器</b>

    一種利用CSD16327Q3實現企業固態硬盤鉭電容短路保護的方法

    電子發燒友網站提供《一種利用CSD16327Q3實現企業固態硬盤鉭電容短路保護的方法.pdf》資料免費下載
    發表于 10-25 10:22 ?0次下載
    <b class='flag-5'>一種</b><b class='flag-5'>利用</b>CSD16327Q3<b class='flag-5'>實現</b>企業固態硬盤鉭電容短路保護的方法

    一種簡單高效配置FPGA的方法

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

    基于FPGA的計算器設計

    本文通過FPGA實現8位十進制數的加、減、乘、除運算,通過矩陣鍵盤輸入數據和運算符,矩陣鍵盤的布局圖如下所示。該計算器可以進行連續運算,當按下等號后,可以直接按數字進行下次運算,或者按運算符,把上次運算結果作為本次運算的第個操
    的頭像 發表于 10-24 14:28 ?1100次閱讀
    基于FPGA的<b class='flag-5'>計算器</b>設計

    CAN位時序參數計算器

    電子發燒友網站提供《CAN位時序參數計算器.pdf》資料免費下載
    發表于 10-11 09:55 ?1次下載
    CAN位時序參數<b class='flag-5'>計算器</b>

    一種利用wireshark對遠程服務/路由網絡抓包方法

    一種利用wireshark對遠程服務/路由網絡抓包方法
    的頭像 發表于 09-21 08:03 ?4513次閱讀
    <b class='flag-5'>一種</b><b class='flag-5'>利用</b>wireshark對遠程服務<b class='flag-5'>器</b>/路由<b class='flag-5'>器</b>網絡抓包方法

    色環電阻計算器的研究與應用

    個理想的色環電阻計算器的界面應該包含個顏色選擇,讓用戶能夠通過點擊或下拉菜單選擇各個顏色環。而在程序邏輯層面,計算器需要具備實時反饋功
    的頭像 發表于 09-18 13:45 ?767次閱讀