• <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  回復  更多評論   

            導航

            <2008年1月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統計

            常用鏈接

            留言簿(75)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久亚洲国产| 亚洲精品国产成人99久久| 久久九九有精品国产23百花影院| 精品久久久久中文字幕一区| 亚洲精品高清国产一久久| 久久久国产精品网站| 久久99精品国产一区二区三区| 久久久久免费看成人影片| 久久久一本精品99久久精品88| 久久精品国产亚洲av高清漫画| 国产麻豆精品久久一二三| 久久精品国产亚洲77777| 久久夜色精品国产网站| 粉嫩小泬无遮挡久久久久久| 国产精品美女久久久m| 久久综合综合久久狠狠狠97色88| 狠狠色丁香久久婷婷综| 国内精品久久久久久久coent| 久久精品国产72国产精福利| 青青草原综合久久大伊人| 亚洲日韩中文无码久久| 国产成人精品白浆久久69| 中文精品久久久久国产网址| 亚洲国产精品成人久久蜜臀| 国色天香久久久久久久小说| 99久久无码一区人妻a黑| 国产三级观看久久| 亚洲精品无码久久久久久| 婷婷久久综合九色综合98| 老司机午夜网站国内精品久久久久久久久 | 伊人热人久久中文字幕| 婷婷久久精品国产| 2021精品国产综合久久| 亚洲国产成人精品91久久久 | 欧美国产精品久久高清| 亚洲乱码中文字幕久久孕妇黑人| 久久青草国产手机看片福利盒子 | 99精品国产在热久久| 久久精品国产只有精品66| 久久国产精品99精品国产| 亚洲国产成人久久笫一页|