• <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>

            hdu 3624 (算術表達式求值)

            /*
            1、左遞歸可以用循環來實現,右遞歸可以用遞歸實現(也可以用循環實現,不過遞歸實現起來比較簡單)
            2、左遞歸實現左結合運算,右遞歸實現右結合運算
            hdu 3624(網址: http://acm.hdu.edu.cn/showproblem.php?pid=3624 ) 的文法
            exp         -> addTerm | exp addOp addTerm
            addOp    -> + | -
            addTerm -> mulTerm | addTerm mulOp mulTerm
            mulOp     -> * | / | %
            mulTerm -> eTerm ^ mulTerm | eTerm
            eTerm    ->sNum | (exp)
            sNum     -> num | -eTerm
            */
            #include <stdio.h>
            #include <memory>
            #include <iostream>
            #include <algorithm>
            #include <cstring>
            #include <vector>
            #include <map>
            #include <cmath>
            #include <set>
            #include <queue>
            #include <time.h>
            #include <limits>
            using namespace std;
            #define vType long long
            #define MAXLEN 2005
            const int vMax = 0x7fffffff;
            const int vMin = ~vMax;
            #define checkVal(val) (val >= vMin && val <= vMax)
            char str[MAXLEN];
            int pos, cnt; //pos為當前掃描位置,cnt為已經分配的節點的數目
            char ch;  //ch為當前掃描的字符
            struct treeNode{
                char op, flag; 
                vType val;
                treeNode* ch[2];
                void setFlag(){
                    if((ch[0] && !ch[0]->flag) || (ch[1] && !ch[1]->flag)){
                        flag = false;
                    }
                }
            }mem[MAXLEN*10];
            treeNode* exp();
            inline bool isDigit(char ch){
                return ch >= '0' && ch <= '9';
            }
            inline treeNode* newNode(){
                mem[cnt].flag = true;
                mem[cnt].op = ' ';  //op為空格表示不需要運算
                mem[cnt].ch[0] = mem[cnt].ch[1] = NULL;
                return &mem[cnt++];
            }
            treeNode* getSyntaxTree(){
                treeNode* tree;
                pos = cnt = 0;
                int i, j;
                i = j = 0;
                ch = '\n';
                do{  //忽略空格
                    if(str[i] != ' ') str[j++] = str[i];
                }while(str[i++]);
             for(i = j = 0; str[i]; i++){ //加這一步是為了處理2000個(的變態數據
              if(str[i] == '(') j++;
              else if(str[i] == ')') j--;
             }
             if(j != 0){
              tree = newNode();
              tree->flag = false;
             }else tree = exp();
                return tree;
            }
            treeNode* eTerm(){
                treeNode* t;
                t = newNode();
                ch = str[pos++];
                if(ch == '('){
                    t = exp();
                    if(ch != ')') t->flag = false;
                    else ch = str[pos++];
                }else if(isDigit(ch)){
                    vType a = ch - '0';
                    for(ch = str[pos++];isDigit(ch); ch = str[pos++]){
                        if(t->flag){
                            a = a * 10 + ch - '0';
                        }
                        if(!checkVal(a)){
                            t->flag = false;
                        }
                    }
              t->val = a;
             }else if(ch == '-'){
              t->op = ch;
              t->ch[0] = newNode();
              t->ch[0]->val = 0;
              t->ch[1] = eTerm();
              t->setFlag();
             }else t->flag = false;
                return t;
            }
            treeNode* mulTerm(){
                treeNode *t, *p, *r, *t0, *t1;;
                r = t = eTerm();
             p = NULL;
                while(ch == '^'){ //循環實現右遞歸文法
              t1 = newNode();
              t1->op = ch;
              t1->ch[0] = t;
              t0 = eTerm();
              t1->ch[1] = t0;
              if(p){
               p->ch[1] = t1;
              }else r = t1;
              p = t1;
              t = t0;
                }
                return r;
            }
            treeNode* addTerm(){
                treeNode *t, *p;
                t = newNode();
                t->ch[0] = mulTerm();
                t->setFlag();
                while(ch == '*' || ch == '/' || ch == '%'){
                    t->op = ch;
                    t->ch[1] = mulTerm();
                    t->setFlag();
                    p = t;
                    t = newNode();
                    t->ch[0] = p;
                }
                return t;
            }
            treeNode* exp(){
                treeNode *t, *p;
                t = newNode();
                t->ch[0] = addTerm();
                while(ch == '-' || ch == '+'){
                    t->op = ch;
                    t->ch[1] = addTerm();
                    p = t;
                    t = newNode();
                    t->ch[0] = p;
                }
                return t;
            }
            void cal(treeNode* root){
                if(!root) return;
                cal(root->ch[0]);
                cal(root->ch[1]);
                root->setFlag();
                if(!root->flag) return;
                if(root->op != ' '){
                    vType a = 0;
                    switch(root->op){
                        case '-':
                            a = root->ch[0]->val - root->ch[1]->val;
                            break;
                        case '+':
                            a = root->ch[0]->val + root->ch[1]->val;
                            break;
                        case '*':
                            a = root->ch[0]->val * root->ch[1]->val;
                            break;
                        case '/':
                            if(root->ch[1]->val == 0){
                                root->flag = false;
                                return;
                            }
                            a = root->ch[0]->val / root->ch[1]->val;
                            break;
                        case '%':
                            if(root->ch[1]->val == 0){
                                root->flag = 0;
                                return;
                            }
                            a = root->ch[0]->val % root->ch[1]->val;
                            break;
                        case '^':
                if(root->ch[1]->val < 0 || (root->ch[0]->val == 0 && root->ch[1]->val == 0)){
                                root->flag = false;
                                return;
                            }
                            double b = pow((double)root->ch[0]->val, (double)root->ch[1]->val);
                            if(checkVal(b)) a = (vType)b;
                            else{
                                root->flag = false;
                                return;
                            }
                            break;
                    }
              if(checkVal(a)){
               root->val = a;
               root->setFlag();
              }else{
               root->flag = false;
              }
                }else if(root->ch[0]){
                    root->flag = root->ch[0]->flag;
                    root->val = root->ch[0]->val;
                }
            }
            int main(){
            #ifndef ONLINE_JUDGE
             //freopen("in.txt", "r", stdin);
                //freopen("out.txt", "w", stdout);
            #endif
                int i, c;
                treeNode* root;
                scanf("%d", &c);
                getchar();
                for(i = 1; i <= c; i++){
                    gets(str);
                    root = getSyntaxTree();
                    printf("Case %d: ", i);
                    cal(root);
              if(root->flag){
               printf("%I64d\n", root->val);
              }
                    else printf("ERROR!\n");
                }
                return 0;
            }

             

            posted on 2011-01-15 01:43 tw 閱讀(554) 評論(0)  編輯 收藏 引用 所屬分類: HDU題解

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導航

            統計

            常用鏈接

            留言簿

            文章分類

            文章檔案

            搜索

            最新評論

            久久人人爽人人爽人人爽| 九九久久精品无码专区| 人妻精品久久久久中文字幕69 | 中文字幕亚洲综合久久菠萝蜜| 亚洲国产精品成人久久蜜臀| 人妻精品久久久久中文字幕69 | 伊人 久久 精品| 国产午夜精品理论片久久影视| 久久99国产精品成人欧美| 人妻少妇久久中文字幕一区二区 | 久久久久无码国产精品不卡| 久久国产精品无码一区二区三区| 亚洲国产精品无码久久九九 | A级毛片无码久久精品免费| 热久久这里只有精品| 久久亚洲美女精品国产精品| 人妻精品久久久久中文字幕| 91精品国产综合久久四虎久久无码一级| 久久久久精品国产亚洲AV无码| 久久e热在这里只有国产中文精品99 | 久久久久亚洲AV无码专区首JN| 久久午夜电影网| 2020久久精品国产免费| 日韩精品久久无码中文字幕| 久久久久久久91精品免费观看| 韩国三级中文字幕hd久久精品| 91精品国产9l久久久久| 久久精品国产亚洲av麻豆小说| 精品国产乱码久久久久久呢| 伊人久久亚洲综合影院| 亚洲国产婷婷香蕉久久久久久| 久久成人国产精品一区二区| 精品久久久久久久久久中文字幕 | 青青草原综合久久大伊人| 色偷偷91久久综合噜噜噜噜| 久久强奷乱码老熟女| 亚洲精品无码久久久| 99精品久久精品一区二区| 国内精品久久久久久99蜜桃| 国产精品久久久久久| 93精91精品国产综合久久香蕉|