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

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            編譯原理實(shí)驗(yàn):后綴式求值(c++)

            /* 將中綴表達(dá)式(a+b)轉(zhuǎn)換為后綴表達(dá)式(ab+)的算法思想:  
               ·
            當(dāng)讀到數(shù)字直接送至輸出隊(duì)列中  
               ·
            當(dāng)讀到運(yùn)算符t時(shí),  
                  a.
            將棧中所有優(yōu)先級(jí)高于或等于t的運(yùn)算符彈出,送到輸出隊(duì)列中;    
                  b.t
            進(jìn)棧  
               ·
            讀到左括號(hào)時(shí)總是將它壓入棧中  
               ·
            讀到右括號(hào)時(shí),將靠近棧頂?shù)牡谝粋€(gè)左括號(hào)上面的運(yùn)算符全部依次彈出,送至輸出隊(duì)列后,再丟棄左括號(hào)。  
              
                 
            運(yùn)用后綴表達(dá)式進(jìn)行計(jì)算的具體做法:  
               ·
            建立一個(gè)棧S  
               ·
            從左到右讀后綴表達(dá)式,讀到數(shù)字就將它轉(zhuǎn)換為數(shù)值壓入棧S中,讀到運(yùn)算符則從棧中依次彈出兩個(gè)數(shù)分別到YX,然后以“X   運(yùn)算符   Y”的形式計(jì)算機(jī)出結(jié)果,再壓加棧S  
               ·
            如果后綴表達(dá)式未讀完,就重復(fù)上面過程,最后輸出棧頂?shù)臄?shù)值則為結(jié)束 */

            #include <iostream>
            #include <string>
            using namespace std;

            char ex[100];//存儲(chǔ)后綴表達(dá)式
            char str[100];//
            存儲(chǔ)算術(shù)表達(dá)式
            char stack[100];//
            作為棧使用
            char ch;//
            當(dāng)前判斷的字符
            int i=0;//i
            為算術(shù)表達(dá)式str的下標(biāo)
            int t;//t
            為后綴式ex的下標(biāo)
            int top=0;//top
            為棧頂
            void trans();//
            轉(zhuǎn)換函數(shù)
            void compute();//
            計(jì)算后綴式的值

            void trans()//將中綴式轉(zhuǎn)換為后綴式
            {
            cout<<"
            輸入一個(gè)算術(shù)表達(dá)式,以#號(hào)結(jié)束:"<<endl;
            while(str[i]!='#')//
            中綴式以#號(hào)結(jié)束
            {
               i++;//
            因?yàn)?span lang="EN-US">i的初值設(shè)為0
               cin>>str[i];
            }

            //
            開始掃描
            t=1;
            i=1;
            ch=str[i];
            i++;//i
            指向當(dāng)前掃描字符的下一位
            while(ch!='#')//
            逐個(gè)掃描,直至遇到#號(hào)結(jié)束
            {
               switch(ch)
               {
               case'('://
            遇到(,進(jìn)棧
                top++;
                stack[top]=ch;
                break;
               case')'://
            遇到),將靠近棧頂?shù)牡谝粋€(gè)左括號(hào)上面的運(yùn)算符全部依次彈出,送至后綴式隊(duì)列后,再丟棄左括號(hào)。
                while(stack[top]!='(')
                {
                 ex[t]=stack[top];
                 top--;
                 t++;
                }
                top--;//
            丟棄(
                break;
               case'+':
               case'-':
                while(top!=0 && stack[top]!='(')
                {
                 ex[t]=stack[top];
                 top--;
                 t++;
                }
                top++;//
            因?yàn)?span lang="EN-US">top的初值為0
                stack[top]=ch;
                break;
               case'*':
               case'/':
                while(stack[top]=='*'|| stack[top]=='/')
               {
                ex[t]=stack[top];
                top--;
                t++;
               }
               top++;
               stack[top]=ch;
               break;
             
               /*
            注意!除操作數(shù)外,其它符號(hào)都要用到棧*/
               default:while(ch>='0' && ch<='9')//
            遇到操作數(shù)直接送至后綴式隊(duì)列
                 {
                  ex[t]=ch;
                  t++;
                  ch=str[i];
                  i++;//
            此時(shí)i指向操作數(shù)之后的運(yùn)算符的后一位!!
                 }
                i--;//
            要在操作數(shù)之后,運(yùn)算符之前添加空格符
                ex[t]=' ';//
            用空格符隔開
                t++;

               }//switch結(jié)束

               ch=str[i];//仿照default中的,返回添加空格符之前的操作
               i++;
            }//
            結(jié)束while


            while(top!=0)//
            仍有運(yùn)算符在棧中
            {
               ex[t]=stack[top];
               t++;
               top--;
            }
            ex[t]=' ';//
            不能省,若省掉則無法進(jìn)入compute函數(shù)??

            for(int j=1;j<i-1;j++)
               cout<<str[j];
            cout<<"
            的后綴式為:";
            for(j=1;j<t;j++)
            cout<<ex[j];

            }

            void compute()
            {
            float stack[100];//
            作為棧使用
            int d;//
            用于存放當(dāng)前的計(jì)算結(jié)果
            char ch;
            int t=1;
            int top =0;
            ch=ex[t];
            t++;

            while(ch!=' ')//此空格符為后綴式中的最后一個(gè)字符,與上文中的" ex[t]=' '; "相對(duì)應(yīng)
            {
               switch(ch)
               {
               case'+':
                stack[top-1]=stack[top-1]+stack[top];
                top--;
                break;
               case'-':
                stack[top-1]=stack[top-1]-stack[top];
                top--;
                break;
               case'*':
                stack[top-1]=stack[top-1]*stack[top];
                top--;
                break;
               case'/':
                if(stack[top]!=0)
                 stack[top-1]=stack[top-1]/stack[top];
                else
                {
                 cout<<"\n
            除零錯(cuò)誤!"<<endl;
                 exit(0);//
            異常退出
                }
                top--;//
            兩個(gè)操作數(shù)算出一個(gè)結(jié)果存放到棧頂,那兩操作數(shù)便可丟棄,故top-1
                break;
               default:
                d=0;
                while(ch>='0' && ch<='9')
                {
                 d=10*d+ch-'0';//
            將數(shù)字字符轉(zhuǎn)化為對(duì)應(yīng)的數(shù)值,*10是與大于10的數(shù)值時(shí)要進(jìn)位
                 ch=ex[t];
                 t++;
                }
                top++;
                stack[top]=d;//
            棧頂存放當(dāng)前計(jì)算結(jié)果
             
               }//switch
            結(jié)束
               ch=ex[t];//
            跳過空格符,掃描下一個(gè)運(yùn)算符或操作數(shù)
               t++;
            }
            cout<<"\n
            計(jì)算結(jié)果為:"<<stack[top]<<endl;
            }

            void main()
            {
            trans();
            compute();
            }

            結(jié)果如圖所示:

            clip_image001

             

            posted on 2010-03-05 16:15 肥仔 閱讀(1295) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 狀態(tài)機(jī) & 自動(dòng)機(jī) & 形式語言

            99久久精品费精品国产一区二区| 麻豆久久久9性大片| 免费观看成人久久网免费观看| 成人国内精品久久久久影院| 久久91精品国产91久久小草| 91精品国产色综久久| 日韩美女18网站久久精品| 久久天天躁狠狠躁夜夜avapp| 婷婷伊人久久大香线蕉AV | 久久九九青青国产精品| 久久久久久国产a免费观看不卡| 久久毛片一区二区| 99久久er这里只有精品18| 久久国产三级无码一区二区| 久久久久青草线蕉综合超碰| 青青草原综合久久| 伊人色综合九久久天天蜜桃| 精品久久久久久久无码 | 国产激情久久久久久熟女老人 | 午夜视频久久久久一区 | 香蕉久久av一区二区三区| MM131亚洲国产美女久久| 午夜精品久久久久久久无码| 久久亚洲精品成人av无码网站| 国产亚洲成人久久| 久久精品人人做人人爽电影蜜月| 国产一区二区精品久久岳 | 久久乐国产精品亚洲综合| 日韩精品无码久久久久久| 久久青青草原亚洲av无码| 久久久久亚洲AV无码永不| 久久性生大片免费观看性| 久久国产乱子伦精品免费强| 久久久久国产精品人妻| 久久99亚洲综合精品首页| 97久久久久人妻精品专区| 久久综合亚洲色一区二区三区| 青青国产成人久久91网| 99999久久久久久亚洲| 久久久一本精品99久久精品88| 国产精品99久久精品爆乳|