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

            我的玻璃盒子

            (轉載)用C++實現的加、減、乘、除表達式計算

            原帖地址:http://www.shnenglu.com/jb8164/archive/2008/01/02/40211.html

            // 頭文件 Calc.h

            #ifndef __CALC_H__
            #define __CALC_H__

            #include 
            <stack>

            #define ascii_int(x) (x >= 0x30 && x <= 0x39) ? (x - 0x30) : (x)
            const int GREATER =  1;
            const int EQUAL   =  0;
            const int LESS    = -1;

            class Calculate {
            public:
              
            int  evaluteExpr(char *exp);

            private:
              
            int  getLevel(char ch);
              
            bool isOperator(char ch);
              
            int  compareOpteratorLevel(char inputChar, char optrStackTop);
              
            int  calc(int num1, int num2, char op);
              
            void evaluate(char ch);

            private:
              std::stack
            <int>  _opnd_stack;
              std::stack
            <char> _optr_stack;
              
            static char _optr[];
              
            static int  _level[];
            }
            ;

            #endif

            // 頭文件的實現代碼 Calc.cxx

            #include "Calc.h"

            char Calculate::_optr[] = {'#''(''+''-''*''/'')'};
            int Calculate::_level[] = 0,   1,   2,   2,   3,   3,   4 };

            // Get current operator level for calculating
            int Calculate::getLevel(char ch) {
              
            for (int i = 0*(_optr+i) != '\0'++i) 
                
            if (*(_optr+i) == ch) 
                  
            return *(_level+i);
            }


            // Calculate the operands
            int Calculate::calc(int num1, int num2, char op) {
              
            switch (op) 
                
            {
                
            case '+':
                  
            return num1 + num2;
                
            case '-':
                  
            return num1 - num2;
                
            case '*':
                  
            return num1 * num2;
                
            case '/':
                  
            return num1 / num2;
                }

            }


            // judge inputing character is operator or not
            bool Calculate::isOperator(char ch) {
              
            for (char *= _optr; *!= '\0'++p)
                
            if (*== ch) 
                  
            return true;

              
            return false;
            }


            // Compare level of input operator and the top operator of operator stack
            int Calculate::compareOpteratorLevel(char inputChar, char optrStackTop) {
            //   if (inputChar == '(' && optrStackTop == ')') 
            //     return EQUAL;
            //   else 
              if (inputChar == '(')
                
            return GREATER;

              
            if (inputChar == ')' && optrStackTop == '('
                
            return EQUAL;
              
            else if (inputChar == ')'
                
            return LESS;

              
            if (inputChar == '#' && optrStackTop == '#'
                
            return EQUAL;
            //   else if (inputChar == '#')
            //     return LESS;

              
            return (getLevel(inputChar) > getLevel(optrStackTop)) ? GREATER : LESS;
            }


            // Evaluate value while inputing operators
            void Calculate::evaluate(char ch) {
              
            char op;
              
            int num, result;

              
            if (!isOperator(ch)) {
                _opnd_stack.push(ascii_int(ch));
                
            return ;
              }


              
            switch (compareOpteratorLevel(ch, _optr_stack.top())) 
                
            {
                
            case GREATER :
                  _optr_stack.push(ch);
                  
            break;

                
            case EQUAL :
                  _optr_stack.pop();
                  
            break;

                
            case LESS :
                  num 
            = _opnd_stack.top();
                  _opnd_stack.pop();

                  result 
            = _opnd_stack.top();
                  _opnd_stack.pop();

                  op 
            = _optr_stack.top();
                  _optr_stack.pop();

                  result 
            = calc(result, num, op);
                  _opnd_stack.push(result);
                  evaluate(ch);
                  
            break;
                }

            }


            // Evaluate user specified expression
            int Calculate::evaluteExpr(char *exp) {
              _optr_stack.push(
            '#');
              
            for (char *=exp; *!= '\0'++p )
                evaluate(
            *p);

              
            int result = _opnd_stack.top();
              _opnd_stack.pop();

              
            return result;
            }


            // 測試代碼 calc_test.cxx

            #include <iostream>
            #include 
            "Calc.h"
            using namespace std;

            int main(void{
              Calculate 
            *calc = new Calculate();
              cout 
            << "1+3*(4+7) = " 
                   
            << calc->evaluteExpr("1+3*(4+7)#"
                   
            << endl;
              cout 
            << "((1+2)) = " 
                   
            << calc->evaluteExpr("((1+2))#"
                   
            << endl;
              cout 
            << "3*8+9/7-5-9+(1-9)/4 = " 
                   
            << calc->evaluteExpr("3*8+9/7-5-9+(1-9)/4#"
                   
            << endl;
              cout 
            << "(6-7)*(5+9) = " 
                   
            << calc->evaluteExpr("(6-7)*(5+9)#"
                   
            << endl;
              cout 
            << "0*8+0/6-9+(7-1) = " 
                   
            << calc->evaluteExpr("0*8+0/6-9+(7-1)#"
                   
            << endl;

              delete calc;
            }


            用 MinGW/G++ 3.4.5 編譯如下:
              g++  -o test.exe  Calc.cxx  Calc_test.cxx

            作為一個演示算法夠了, 但代碼還是有一些缺點:
               (1) 只能處理一位數的加、減、乘、除表達式計算(可帶括號)
               (2) 沒有任何錯誤處理,例如不能在表達式中有空格

            posted on 2008-01-23 15:03 深藍色系統 閱讀(383) 評論(1)  編輯 收藏 引用 所屬分類: 皮皮片片

            評論

            # re: (轉載)用C++實現的加、減、乘、除表達式計算 2009-08-07 10:40 遠古毛利人

            看這篇用Boost的Spirit實現的方案:
            http://blog.csdn.net/Waiting4you/archive/2009/02/07/3867782.aspx  回復  更多評論   

            導航

            <2009年12月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統計

            常用鏈接

            留言簿(75)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            成人亚洲欧美久久久久| 国产成年无码久久久免费| 2021国产精品久久精品| 国产日韩久久免费影院| 69国产成人综合久久精品| 国产V亚洲V天堂无码久久久| 久久久久亚洲精品日久生情| 国产精品99久久久精品无码| 欧美与黑人午夜性猛交久久久 | 99久久香蕉国产线看观香| 久久伊人精品青青草原日本| 国内精品久久久久久麻豆 | 久久亚洲AV无码西西人体| 精品99久久aaa一级毛片| 久久播电影网| 狠狠色婷婷久久一区二区| 久久婷婷五月综合97色一本一本| 国产精品久久波多野结衣| 久久精品九九亚洲精品天堂| 久久国产精品久久| 国内精品久久久久影院免费| 国产人久久人人人人爽| 久久精品无码午夜福利理论片| 久久久久久国产精品美女| 精品人妻伦一二三区久久| 久久中文字幕人妻熟av女| 欧美精品乱码99久久蜜桃| 亚洲а∨天堂久久精品| 一本久久综合亚洲鲁鲁五月天| 久久五月精品中文字幕| 青青久久精品国产免费看| 亚洲欧美久久久久9999| 国产精品美女久久福利网站| 99久久国产亚洲综合精品| 久久久SS麻豆欧美国产日韩| 久久人与动人物a级毛片| 99精品国产综合久久久久五月天| 色88久久久久高潮综合影院| 一本色道久久综合亚洲精品| 国产精品99久久精品爆乳| 亚洲欧美精品一区久久中文字幕|