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

            飛天

            快樂的生活......

             

            表達(dá)式計算(不轉(zhuǎn)換成后綴表達(dá)式)

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

            #include 
            ".\calculate.h"
            calculate::calculate()
            {
                
            //初始化優(yōu)先級
                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
                        
            {
                            
            //比較操作符優(yōu)先級
                            
            //如果操作符大於橨蝢的操作符優(yōu)先級,則入橨,否則計算.
                            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;
                }

                
            //計算橨內(nèi)剩余操作符
                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;
            }

            // 優(yōu)先級大小
            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();
                }

            }

            //數(shù)值出橨
            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 飛天 閱讀(434) 評論(0)  編輯 收藏 引用 所屬分類: 算法描述

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            Blogs

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            国产毛片欧美毛片久久久| 亚洲色大成网站WWW久久九九| 人人狠狠综合久久亚洲婷婷| 久久国产影院| 久久精品国产精品亚洲毛片 | 亚洲精品国产字幕久久不卡| 91精品国产高清91久久久久久| 久久精品国产亚洲5555| MM131亚洲国产美女久久| 色婷婷狠狠久久综合五月| 亚洲欧美精品伊人久久| 精品久久久中文字幕人妻| 久久WWW免费人成—看片| 69久久精品无码一区二区| 精品人妻伦九区久久AAA片69| 久久久久亚洲AV成人网| 久久99国产精品久久99| 久久精品亚洲精品国产色婷| 国产69精品久久久久APP下载| 久久久精品国产Sm最大网站| 一本一道久久精品综合| 精品一区二区久久久久久久网站| 亚洲精品高清国产一线久久| 伊人久久综合无码成人网| 精品国产日韩久久亚洲| 久久久久久亚洲精品不卡| 91久久精品国产91性色也| 国产成人久久精品麻豆一区| 欧美综合天天夜夜久久| 国内精品久久久久久不卡影院| 久久噜噜电影你懂的| 天天综合久久久网| 99久久精品国产一区二区| 91精品国产91久久久久久| 久久99精品久久久久久齐齐| 久久久久国产日韩精品网站| 久久免费观看视频| 亚洲欧洲日产国码无码久久99| 色欲av伊人久久大香线蕉影院| 精品久久8x国产免费观看| 伊人久久综合热线大杳蕉下载|