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

            飛天

            快樂的生活......

             

            表達式計算(不轉換成后綴表達式)

                   昨天晚上沒事,把《數據結構》書拿出來看,在堆棧那一章里面,講到使用堆棧來實現表達式求值。步驟是先將表達式轉換為后綴表達式,在對后綴表達式處理。
                    今天在公司沒事,也寫了個表達式計算。不需要轉換成后綴,可以直接計算。大概的算法是:生成兩個棧,一個是用來存放數值,一個用來放操作符。如果操作符大于棧頂符號的優先值,則取出數值和操作符進行計算。將計算的結果放到數值棧中。如果是‘)’,則要計算直到符號棧中為‘(’。好象講的不清楚,還是看程序。
            #include "StdAfx.h"

            #include 
            ".\calculate.h"
            calculate::calculate()
            {
                
            //初始化優先級
                map_priority['+']=1;
                map_priority[
            '-']=1;

                map_priority[
            '*']=2;
                map_priority[
            '/']=2;

                map_priority[
            '(']=3;
                map_priority[
            ')']=3;
            }


            calculate::
            ~calculate(void)
            {

            }

            //開始
            void calculate::Run(void)
            {
                
            char sign;
                
            double num;
                
            double num1,num2;
                cin
            >>sign;
                
            while(sign!='=')
                
            {
                    
            if(isSign(sign))  //sign是符號
                    {
                        
            if(sign==')')
                        
            {
                            
            //如果是')'操作符,則計算橨直到'('
                            calculatestack('(');
                        }

                        
            else
                        
            {
                            
            //比較操作符優先級
                            
            //如果操作符大於橨蝢的操作符優先級,則入橨,否則計算.
                            if(stack_sign.size()==0||get_priority(sign)>get_priority(stack_sign.top()))
                            
            {
                                
            //操作符入欑
                                stack_sign.push(sign);
                            }

                            
            else
                            
            {        
                                
            char ch=stack_sign.top();
                                
            if(ch!='(')
                                
            {
                                    stack_sign.pop();
                                    num2
            =stack_pop();
                                    num1
            =stack_pop();
                                    stack_numeral.push(Calculate(num1,num2,ch));
            //將計算的值重新入橨
                                }

                                stack_sign.push(sign);
                            }

                        }

                    }

                    
            else
                    
            {
                        cin.putback(sign);
                        cin
            >>num;
                        stack_numeral.push(num);
                    }

                    cin
            >>sign;
                }

                
            //計算橨內剩余操作符
                calculatestack();

                cout
            <<stack_numeral.top()<<endl;
                system(
            "PAUSE");
            }

            //是否是操作符
            bool calculate::isSign(char sign)
            {
                
            if(map_priority.find(sign)==map_priority.end())
                    
            return false;
                
            else
                    
            return true;
            }

            // 優先級大小
            int calculate::get_priority(char sign)
            {
                
            return map_priority[sign];
            }


            double calculate::Calculate(double &num1,double &num2,char & sign)
            {
                
            double temp;
                
            switch(sign)
                
            {
                
            case '+':
                    temp
            =num1+num2;
                    
            break;
                
            case '-':
                    temp
            =num1-num2;
                    
            break;
                
            case '*':
                    temp
            =num1*num2;
                    
            break;
                
            case '/':
                    temp
            =num1/num2;
                    
            break;
                }

                
            return temp;
            }

            //計算橨直到操作符是sign
            void calculate::calculatestack(char sign)
            {
                
            char ch;
                
            double num1,num2;
                ch
            =stack_sign.top();
                stack_sign.pop();
                
            while(ch!=sign)
                
            {
                    num2
            =stack_pop();
                    num1
            =stack_pop();
                    stack_numeral.push(Calculate(num1,num2,ch));
            //將計算的值重新入橨
                    if(stack_sign.size()==0//如果為空
                        break;
                    ch
            =stack_sign.top();
                    stack_sign.pop();
                }

            }

            //數值出橨
            double calculate::stack_pop()
            {
                
            double n;
                
            if(stack_numeral.size()==0)
                    
            return 0;
                
            else
                    n
            =stack_numeral.top();
                stack_numeral.pop();
                
            return n;

            }

            文件頭

            posted on 2007-10-30 16:50 飛天 閱讀(418) 評論(0)  編輯 收藏 引用 所屬分類: 算法描述

            導航

            統計

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            Blogs

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            午夜不卡久久精品无码免费| 99国内精品久久久久久久| 武侠古典久久婷婷狼人伊人| 中文字幕久久精品| 久久精品中文騷妇女内射| 97精品国产97久久久久久免费| 无码国内精品久久人妻麻豆按摩| 午夜精品久久久久久99热| 91精品国产色综久久| 日韩欧美亚洲综合久久| 日本道色综合久久影院| 亚洲欧美日韩精品久久亚洲区 | 国产综合成人久久大片91| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久久久波多野结衣高潮| 国产精品久久久久久| 久久精品国产AV一区二区三区| 国产精品久久久久久久| 要久久爱在线免费观看| 色综合久久久久| 久久久久亚洲Av无码专| 四虎久久影院| 久久噜噜久久久精品66| 亚洲精品国产成人99久久| 久久久SS麻豆欧美国产日韩| 久久国产免费| yellow中文字幕久久网| 国内精品久久久久久99蜜桃 | 久久国产精品一国产精品金尊| 亚洲国产精品嫩草影院久久 | 久久超乳爆乳中文字幕| 亚洲国产精品18久久久久久| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久综合亚洲色一区二区三区| 久久久久九国产精品| 国产精品欧美亚洲韩国日本久久 | 久久国产香蕉视频| 精品久久人人做人人爽综合| 91精品婷婷国产综合久久| 国产亚洲色婷婷久久99精品91| 日本一区精品久久久久影院|