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

            飛天

            快樂的生活......

             

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

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

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

            }

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

            導航

            統(tǒng)計

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            Blogs

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产AV一区二区三区| 天天爽天天爽天天片a久久网| 久久精品无码一区二区三区日韩 | 国产精品毛片久久久久久久| 久久精品夜夜夜夜夜久久| 久久精品aⅴ无码中文字字幕不卡| 久久国产精品无码一区二区三区 | 亚洲国产精品人久久| 久久中文字幕视频、最近更新 | 久久香蕉一级毛片| 中文字幕久久精品 | 久久久久久久波多野结衣高潮 | 一本色道久久88加勒比—综合| 久久综合九色综合欧美狠狠| 亚洲国产精品成人AV无码久久综合影院 | 亚洲国产精品无码久久青草| 久久精品国产久精国产思思| 精品国产综合区久久久久久| 性做久久久久久久| 亚洲国产天堂久久久久久| 久久最近最新中文字幕大全 | 欧美噜噜久久久XXX| 久久精品国产免费一区| 久久综合久久鬼色| 色综合久久久久网| 91精品国产色综合久久| 国产成人精品久久| 亚洲国产成人久久精品99 | 99久久99久久精品国产片果冻| 久久一区二区免费播放| 99久久精品国产麻豆| 久久99久国产麻精品66| 亚洲国产精品成人久久蜜臀 | 久久精品蜜芽亚洲国产AV| 亚洲国产成人精品久久久国产成人一区二区三区综 | 7777精品伊人久久久大香线蕉| 久久久99精品成人片中文字幕| 国产精品伦理久久久久久| 久久久久久免费一区二区三区 | 精品久久久久久久久午夜福利| 漂亮人妻被中出中文字幕久久|