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

            我的玻璃盒子

            (轉(zhuǎn)載)用C++實(shí)現(xiàn)的加、減、乘、除表達(dá)式計(jì)算

            原帖地址:http://m.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

            // 頭文件的實(shí)現(xiàn)代碼 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;
            }


            // 測(cè)試代碼 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

            作為一個(gè)演示算法夠了, 但代碼還是有一些缺點(diǎn):
               (1) 只能處理一位數(shù)的加、減、乘、除表達(dá)式計(jì)算(可帶括號(hào))
               (2) 沒有任何錯(cuò)誤處理,例如不能在表達(dá)式中有空格

            posted on 2008-01-23 15:03 深藍(lán)色系統(tǒng) 閱讀(387) 評(píng)論(1)  編輯 收藏 引用 所屬分類: 皮皮片片

            評(píng)論

            # re: (轉(zhuǎn)載)用C++實(shí)現(xiàn)的加、減、乘、除表達(dá)式計(jì)算 2009-08-07 10:40 遠(yuǎn)古毛利人

            看這篇用Boost的Spirit實(shí)現(xiàn)的方案:
            http://blog.csdn.net/Waiting4you/archive/2009/02/07/3867782.aspx  回復(fù)  更多評(píng)論   

            導(dǎo)航

            <2009年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            統(tǒng)計(jì)

            常用鏈接

            留言簿(75)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            天天躁日日躁狠狠久久| 久久久WWW免费人成精品| 久久影视综合亚洲| 久久99热这里只有精品国产| 久久国产精品-国产精品| 久久精品夜夜夜夜夜久久| 精品久久久久久中文字幕人妻最新| 亚洲伊人久久精品影院| 99久久精品免费看国产一区二区三区 | 精品久久久一二三区| 人妻系列无码专区久久五月天| 亚洲欧洲精品成人久久奇米网| 亚洲人成无码www久久久| 久久人人爽人人爽人人爽 | 国产成人精品久久亚洲高清不卡| 97超级碰碰碰碰久久久久| 欧美精品一本久久男人的天堂| 久久精品这里只有精99品| 热综合一本伊人久久精品| 2019久久久高清456| 久久精品欧美日韩精品| 久久se精品一区二区影院 | 亚洲精品成人久久久| 久久久免费精品re6| 国产精品内射久久久久欢欢 | 91精品国产9l久久久久| 国产精品久久久天天影视香蕉| 色99久久久久高潮综合影院| 亚洲AV无码久久精品色欲| 狠色狠色狠狠色综合久久| 亚洲精品美女久久久久99小说 | 国产亚州精品女人久久久久久 | 久久亚洲欧美日本精品| 中文字幕精品久久久久人妻| 1000部精品久久久久久久久| 久久久精品无码专区不卡| 久久狠狠高潮亚洲精品| 久久这里都是精品| 国产叼嘿久久精品久久| 久久精品亚洲精品国产色婷 | 久久99中文字幕久久|