新聞中心

        棧的經典運用

        作者: 時間:2016-12-01 來源:網絡 收藏

        后綴表達式求值的問題,實現(xiàn)了后綴表達式的轉換,實現(xiàn)表達式的求值問題也就比較簡單了,實現(xiàn)的基本思路如下:
        遍歷后綴表達式,遇到非操作符的字符則直接壓入棧中,如果遇到操作符則從棧中彈出兩個對象,進行對應的操作,然后將計算的結果又壓入棧中。繼續(xù)遍歷,直到表達式被遍歷完成,此時棧中保存的值也就是當前表達式的值,需要注意除法和減法的操作數(shù)順序問題以及除數(shù)不能為0的。為了說明該方法的準確性,我采用0-9以內的數(shù)作為操作數(shù),進行4則運算,目前我還只能實現(xiàn)這些計算,對于復雜的多位數(shù)還需要另外的處理。實現(xiàn)的代碼如下:

        本文引用地址:http://www.104case.com/article/201612/324510.htm

        /*后綴表達式求值問題*/
        int retVal(const string &src)
        {
        Stack stack;
        int temp = 0, s = 0;

        int len = src.size();
        for(string::size_type i = 0; i != len; ++ i)
        {
        /*本程序只能處理整形的加減乘除操作*/
        switch(src[i])
        {
        /*遇到數(shù)值直接壓入棧中*/
        case 0:case 1:case 2: case 3: case 4:
        case 5:case 6:case 7: case 8: case 9:
        {
        stack.push(myatoi(src[i]));
        break;
        }
        /*********************************************
        * 遇到操作符彈出兩個數(shù)值進行操作
        * 需要注意減法和除法的壓棧順序
        * 操作完成以后將得到的結果壓入到棧中
        * 最后棧中的值就是計算的結果
        **********************************************/
        case +:
        {
        temp = stack.pop() + stack.pop();
        stack.push(temp);
        temp = 0;
        break;
        }
        case -:
        {
        s = stack.pop();
        temp = stack.pop() - s;
        stack.push(temp);
        s = 0;
        temp = 0;
        break;
        }
        case *:
        {
        temp = stack.pop() * stack.pop();
        stack.push(temp);
        temp = 0;
        break;
        }
        case /:
        {
        s = stack.pop();
        if(s != 0)
        {
        temp = stack.pop() / s;
        }
        stack.push(temp);
        s = 0;
        temp = 0;
        break;
        }
        }
        }
        /*獲得最后的值*/
        return stack.pop();
        }


        為了分析上面的代碼準確性,寫了如下的測試代碼:

        int main()
        {
        string s1;
        cout << "Input a string to test the balance :" << endl;
        cin >> s1;
        isbalance(s1);
        #if 10
        string src;
        string dst;
        cout << "Input a expression: " << endl;
        cin >> src;
        midtolast(src,dst);
        cout << "After the convertion: " << endl;
        cout << dst << endl;
        cout << "The result of expression: " << endl;
        cout << retVal(dst) << endl;
        #endif
        return 0;
        }

        測試結果:

        [gong@Gong-Computer data_struct]$ vi testblance.cpp
        [gong@Gong-Computer data_struct]$ g++ -g testblance.cpp -o testblance
        [gong@Gong-Computer data_struct]$ ./testblance
        Input a string to test the balance :
        This(is)[a]{te}.
        string is
        Input a expression:
        3*3-(5-2+3*6)*(7-3*1)
        After the convertion:
        33*52-36*+731*-*-
        The result of expression:
        -75

        從上面的測試結果基本上實現(xiàn)符號平衡測試、表達式的求值問題,但是當前的表達式只能計算0-9為操作數(shù)的四則運算,復雜的多位數(shù)還不能進行測試。

        以上的三個例子是棧的經典運用,對棧的特性先入后出有更深層次的理解才能更好的運用。

        在函數(shù)調用中,如果不保存調用程序的狀態(tài),在被調用程序中就會修改程序的狀態(tài),這時候也就不能還原到之前的狀態(tài),只有將當前的狀態(tài)保存起來,壓入棧中,當被調用程序執(zhí)行完成以后,將當前程序棧中的內容彈出就能實現(xiàn)任務狀態(tài)的還原,當前函數(shù)執(zhí)行完成以后,調用該函數(shù)的狀態(tài)也需要還原。這時候就實現(xiàn)了先調用的函數(shù)最后執(zhí)行,所以說函數(shù)調用是典型的先入后出問題。這也說明為什么棧如此的重要。


        上一頁 1 2 3 下一頁

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 台南县| 来安县| 丰镇市| 左权县| 大厂| 湘潭市| 荔浦县| 凌海市| 全南县| 阳春市| 五华县| 自贡市| 清镇市| 马山县| 泸定县| 会同县| 西丰县| 宁安市| 治多县| 德阳市| 七台河市| 遵化市| 曲麻莱县| 屏山县| 普陀区| 日土县| 项城市| 泽库县| 华坪县| 顺平县| 新野县| 盐源县| 柏乡县| 黄浦区| 远安县| 桂东县| 嘉禾县| 麻栗坡县| 滦平县| 香港 | 贵德县|