• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天之道

            享受編程的樂趣。
            posts - 118, comments - 7, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            簡(jiǎn)單表達(dá)式求值

            Posted on 2012-10-08 17:25 hoshelly 閱讀(1261) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Programming
            描述
            給一些包含加減號(hào)和小括號(hào)的表達(dá)式,求出該表達(dá)式的值。表達(dá)式中的數(shù)值均為絕對(duì)值小于 10 的整數(shù)。

            輸入
            第一行為表達(dá)式的個(gè)數(shù) n,以下 n 行每行有一個(gè)表達(dá)式。每個(gè)表達(dá)式的長(zhǎng)度不超過 20 個(gè)字符。

            輸出
            對(duì)每個(gè)表達(dá)式,輸出它的值。

            樣例輸入
            3
            3-(2+3)
            -9+8+(2+3)-(-1+4)
            0-0
            樣例輸出
            -2
            1
            0

            //對(duì)每種情況都要考慮清楚

            #include <cctype>
            #include <iostream>
            #include <string>
            #include <stack>
            #include <map>

            using namespace std;

            int getPrecedence(const char optr) //給各個(gè)操作符定義優(yōu)先級(jí)順序,利用map容器
            {
                map<charint> precedTable;
                precedTable['#'] = 0;
                precedTable[')'] = 1;
                precedTable['+'] = 2;
                precedTable['-'] = 2;
                precedTable['*'] = 3;
                precedTable['/'] = 3;
                precedTable['('] = 10;
                return precedTable[optr];
            }

            int calculate(int a, char optr, int b)
            {
                switch (optr) {
                    case '+': return a + b;
                    case '-': return a - b;
                    case '*': return a * b;
                    case '/': return a / b;
                    defaultreturn 0;
                }
            }

            int evaluate(const string& expr)
            {
                stack<int> opnd;  
                stack<char> optr;   
                char last_ch = '\0'; //每次檢查字符時(shí)的前一個(gè)字符
                for (size_t i = 0; i != expr.size(); ++i) {  
                    const char ch = expr[i];
                    if (isspace(ch)) { //如果是空格,即跳過
                        continue;
                    } else if (isdigit(ch)) { //如果是數(shù)字,則壓入操作數(shù)棧
                        opnd.push(ch - '0');
                    } else {
                        if ((ch == '-'  || ch == '+') && (last_ch == '\0' || last_ch == '(')) //遇到 '+'、'-',則壓入0進(jìn)操作數(shù)棧
                            opnd.push(0);    //如 7-1,遇'-'則壓入0進(jìn)棧,,'-'則進(jìn)操作符棧,遇到下一個(gè)數(shù)1,計(jì)算0-1得-1
                        if (optr.empty() || ch == '(' || (optr.top() == '(' && ch != ')') || getPrecedence(ch) > getPrecedence(optr.top())) {
                            optr.push(ch);
                        } 
                        else 
                        {
                            while (!optr.empty() && optr.top() != '(' && getPrecedence(ch) <= getPrecedence(optr.top())) 
                            {
                                int b = opnd.top(); opnd.pop();
                                int a = opnd.top(); opnd.pop();
                                opnd.push(calculate(a, optr.top(), b));
                                optr.pop();
                            }
                            if (ch == ')')
                                optr.pop();    
                            else
                                optr.push(ch);
                        }
                    }
                    last_ch = ch;
                }
                while (!optr.empty()) {
                    int b = opnd.top(); opnd.pop();
                    int a = opnd.top(); opnd.pop();
                    opnd.push(calculate(a, optr.top(), b));
                    optr.pop();
                }
                int result = opnd.top(); opnd.pop();
                return result;
            }

            int main()
            {
                int n;
                cin >> n;
                while (n-- > 0) {
                    string expr;
                    cin>>expr;
                    cout << evaluate(expr) << endl;
                }
                return 0;
            }
            久久久久综合国产欧美一区二区 | 亚洲国产精品18久久久久久| 国产精品伦理久久久久久| 精品久久久久久无码人妻热| 偷偷做久久久久网站| 久久精品中文无码资源站| 国产韩国精品一区二区三区久久| 久久福利片| 国产精品久久亚洲不卡动漫| 久久久精品久久久久特色影视| 日韩人妻无码精品久久免费一| 久久久WWW免费人成精品| 久久精品aⅴ无码中文字字幕重口| 精品久久久久久无码中文野结衣 | 久久91精品久久91综合| 精品久久久久久久国产潘金莲| 青青草国产成人久久91网| 免费精品久久天干天干| 久久精品无码一区二区日韩AV| 久久青草国产精品一区| 久久精品国产亚洲AV忘忧草18| 一级做a爰片久久毛片免费陪 | 人妻少妇精品久久| 成人a毛片久久免费播放| 2022年国产精品久久久久| 久久久久亚洲AV无码观看| 欧美成a人片免费看久久| 色综合合久久天天给综看| 亚洲午夜久久久精品影院| 精品久久久久久综合日本| 国产成人久久精品激情 | 久久久久久夜精品精品免费啦| 大香伊人久久精品一区二区| 国产精品美女久久福利网站| 欧美久久久久久午夜精品| 精品水蜜桃久久久久久久| 久久精品无码一区二区三区日韩| 久久精品国产亚洲Aⅴ香蕉| 欧美久久久久久| 久久人人爽人人爽人人片AV高清| 国内精品伊人久久久影院|