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

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            棧的應用-表達式求值(后綴式)

            ·       以下就分"如何按后綴式進行運算""如何將原表達式轉換成后綴式"兩個問題進行討論。

            n       如何按后綴式進行運算?

            可以用兩句話來歸納它的求值規則:"先找運算符,后找操作數。

               運算過程為:對后綴式從左向右"掃描",遇見操作數則暫時保存,遇見運算符即可進行運算;此時參加運算的兩個操作數應該是在它之前剛剛碰到的兩個操作數,并且先出現的是第一操作數,后出現的是第二操作數。

            n       如何由原表達式轉換成后綴式?
            先分析一下
            原表達式后綴式兩者中運算符出現的次序有什么不同。
            例一
            .  原表達式:a×b/c×d e+f

                      后綴式:a b × c / d × e f +

               例二.  原表達式:a+b×c – d/e×f

                      后綴式: a b c × + d e / f ×

            對原表達式中出現的每一個運算符是否即刻進行運算取決于在它后面出現的運算符,如果它的優先數"高或等于"后面的運算,則它的運算先進行,否則就得等待在它之后出現的所有優先數高于它的"運算"都完成之后再進行。

            從原表達式求得后綴式的規則為:
                   1) 設立運算符棧;
                   2) 設表達式的結束符為“#”,預設運算符棧的棧底為“#”;
                   3) 若當前字符是操作數,則直接發送給后綴式;
                   4) 若當前字符為運算符且優先數大于棧頂運算符,則進棧,否則退出棧頂運算符發送給后綴式;
                   5) 若當前字符是結束符,則自棧頂至棧底依次將棧中所有運算符發送給后綴式;
                   6) (”對它之前后的運算符起隔離作用,則若當前運算符為“(”時進棧;
                   7) ")"可視為自相應左括弧開始的表達式的結束符,則從棧頂起,依次退出棧頂運算符發送給后綴式直至棧頂字符為"("止。

             

            void transform(char suffix[ ], char exp[ ] ) {

            // 從合法的表達式字符串 exp 求得其相應的后綴式 suffix
            InitStack(S); Push(S,
            # );
            p = exp; ch = *p;
            while (!StackEmpty(S)) {

              if (!IN(ch, OP)) Pass( suffix, ch);
              else {
               switch (ch) {
               case ( : Push(S, ch); break;
               case ) : {
                         Pop(S, c);
                        while (c!= ( )
                         { Pass( suffix, c); Pop(S, c);}
                            break; }
               default : {

                                while(Gettop(S, c) && ( precede(c,ch)))
                           { Pass( suffix, c); Pop(S, c); }
                           if ( ch!= # ) Push( S, ch);
                           break;
                          } // defult
               } // switch
             } // else
             if ( ch!= # ) { p++; ch = *p; }
            } // while

            } // transform

             

            posted on 2010-03-05 16:19 肥仔 閱讀(2970) 評論(1)  編輯 收藏 引用 所屬分類: 狀態機 & 自動機 & 形式語言

            評論

            # re: 棧的應用-表達式求值(后綴式)  回復  更多評論   

            復雜的parser寫多了,自然會重新發明boost::spirit車輪一次的,然后從此再也不寫parser……
            2010-03-06 21:28 | 陳梓瀚(vczh)
            久久国产精品成人片免费| 精品久久久久久国产免费了| 久久久精品日本一区二区三区 | 国产精品久久久久蜜芽| 国产精品一区二区久久精品无码| 久久亚洲精品国产精品婷婷| 国产精品免费久久久久影院| 久久免费高清视频| 香蕉久久影院| 久久99精品国产麻豆宅宅| 久久国产精品成人影院| 国产成人久久AV免费| 久久精品国产69国产精品亚洲| 久久综合久久综合久久| 91精品国产91热久久久久福利 | 亚洲一区精品伊人久久伊人| 日韩人妻无码精品久久免费一| 精品伊人久久大线蕉色首页| 久久亚洲AV成人无码电影| 久久久久亚洲AV片无码下载蜜桃| 日韩精品久久久肉伦网站| 狠狠色噜噜狠狠狠狠狠色综合久久 | 久久久久久噜噜精品免费直播| 午夜视频久久久久一区| 99久久精品国产一区二区 | 午夜精品久久久久久久无码| 亚洲AV无码久久寂寞少妇| 狠色狠色狠狠色综合久久| 国产高清国内精品福利99久久| 欧美午夜精品久久久久久浪潮| 中文字幕无码久久久| 久久婷婷五月综合97色 | 久久精品国产只有精品66| 久久久久青草线蕉综合超碰| 久久久久高潮毛片免费全部播放 | 久久夜色精品国产噜噜亚洲AV| 色综合久久中文色婷婷| 97视频久久久| 国产精品伦理久久久久久 | 久久综合给合久久狠狠狠97色| 国产高潮国产高潮久久久91|