隨筆 - 251  文章 - 504  trackbacks - 0
          <2006年10月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          本博客系個(gè)人收集材料及學(xué)習(xí)記錄之用,各類“大俠”勿擾!

          留言簿(14)

          隨筆分類

          收藏夾

          My Favorite Web Sites

          名Bloger

          非著名Bloger

          搜索

          •  

          積分與排名

          • 積分 - 202782
          • 排名 - 284

          最新評(píng)論

          問(wèn)題描述:

          ??? 設(shè)計(jì)并實(shí)現(xiàn)魔王語(yǔ)言的解釋器,具體要求如下:大寫(xiě)字母表示魔王語(yǔ)言的詞匯;小寫(xiě)字母表示人的詞匯語(yǔ)言;魔王語(yǔ)言中可包含括號(hào)。

          ??? 如:我們有魔王語(yǔ)言的解釋規(guī)則:B->tAdA;A->sae;則魔王語(yǔ)言 B(ehnxgz)B解釋成tsaedsaeezegexenehetsaedsae。

          實(shí)現(xiàn)代碼如下:

          #include<stdlib.h>
          #include<stdio.h>
          #define STACK_INIT_SIZE 100 //存儲(chǔ)空間初始分配量
          #define STACK_INCREMENT? 10? //存儲(chǔ)空間分配增量
          #define OVERFLOW????????? 1
          #define OK????????? 1
          #define ERROR????? 0
          #define TRUE??????? 1
          #define FALSE?????? 0
          typedef char????? SElemType;
          typedef char????? QElemType;
          typedef int???? Status;
          typedef struct{
          ?SElemType *base;??????????? //棧基址
          SElemType *top;???????????? //棧頂?shù)刂?br />?int stacksize;
          }SqStack;
          typedef struct QNode{
          ?QElemType data;
          ?struct QNode *next;
          }QNode,*QueuePtr;
          typedef struct{
          ?QueuePtr front;?? //隊(duì)頭指針
          ?QueuePtr rear;??? //隊(duì)尾指針
          }LinkQueue;
          Status InitStack(SqStack &S)
          //構(gòu)造一個(gè)空棧
          {
          ?S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(char));
          ?if(!S.base)
          ??exit (OVERFLOW);//存儲(chǔ)單元分配失敗
          ?S.top=S.base;
          ?S.stacksize=STACK_INIT_SIZE;
          ?return OK;
          }
          Status Push(SqStack &S,SElemType e)
          //插入元素e棧頂單元
          {
          ?if(S.top-S.base>=S.stacksize)
          ?{//棧滿,追加存儲(chǔ)空間
          ??S.base=(SElemType *)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(char));
          ?if(!S.base)
          ??exit (OVERFLOW);//存儲(chǔ)單元分配失敗
          ?S.top=S.base+S.stacksize;
          ?S.stacksize+=STACK_INCREMENT;
          ?}
          ?*(S.top)=e;
          ?S.top++;
          ?return OK;
          }
          Status Pop(SqStack &S,SElemType& e)
          //若棧不為空,則刪除S的棧頂單元,用e返回其值
          {
          ?if(S.base==S.top)
          ??return ERROR;
          ?S.top--;
          ?e=*(S.top);
          ?return OK;
          }
          Status StackEmpty(SqStack S)
          {
          ?if(S.base==S.top)
          ??return 0;
          ?else
          ??return 1;
          }

          Status InitQueue(LinkQueue &Q)
          //構(gòu)造一個(gè)空隊(duì)列Q
          {
          ?Q.front=Q.rear=(QueuePtr)malloc(sizeof (QNode));
          ?if(!Q.front)
          ??exit (OVERFLOW);
          ?Q.front->next=NULL;
          ?return OK;
          }
          Status EnQueue (LinkQueue&Q,QElemType e)
          //插入元素e為Q的新的隊(duì)尾元素
          {
          ?QueuePtr p;
          ?p=(QueuePtr)malloc(sizeof (QNode));
          ?p->data=e;
          ?p->next=NULL;
          ?Q.rear->next=p;
          ?Q.rear=p;
          ?return OK;
          }
          Status DeQueue (LinkQueue &Q,QElemType &e)
          //若隊(duì)列不空,則刪除Q的隊(duì)頭元素,用e返回其值,并返回OK;
          //否則返回ERROR
          {
          ?QueuePtr p;
          ?if(Q.front==Q.rear)
          ??return ERROR;
          p=Q.front->next;
          ?e=p->data;
          ?Q.front->next=p->next;
          ?if(p==Q.rear)
          ??Q.rear=Q.front;
          ?free(p);
          ?return OK;
          }
          Status QueueEmpty(LinkQueue Q)
          //若隊(duì)列Q為空隊(duì)列,則返回TRUE,否則返回FALSE
          {
          ?if(Q.rear==Q.front)
          ??return FALSE;
          ?else
          ??return TRUE;
          }
          void InStack(char fiend[],SqStack &S)
          {
          ?int m,i=0;
          ?for(;fiend[i]!='\0';i++);//計(jì)算fiend中有多少
          ?for(m=i-1;m>=0;m--)
          ??Push(S,fiend[m]);
          }
          void main()
          {
          ?char e,c,d;
          ?SqStack S,zhan;
          ?LinkQueue Q;
          ?? InitQueue(Q);
          ?char? mowang[]="B(ehnxgz)B";
          ?printf("你想要解釋的魔王語(yǔ)言為:%s\n",mowang);
          ??? char? B[]="tAdA";
          ?InitStack(S);
          ?InitStack(zhan);
          ?InStack(mowang,S);//全部壓進(jìn)棧中
          ?while(StackEmpty(S))//在棧不為空的情況下
          ?{
          ??Pop(S,e);
          ??if(e=='B')
          ??InStack(B,zhan);
          ??else
          if(e=='(')//如果為右括號(hào),則輸出括號(hào)中所有內(nèi)容
          ???{
          ????while(Pop(S,e)&&e!=')')//當(dāng)為左括號(hào)時(shí)停止
          ????{
          ?????if(e!=')')
          ?????EnQueue (Q,e);
          ????}
          ?????DeQueue (Q,c);//讀出隊(duì)列中第一個(gè)元素
          ????while(QueueEmpty(Q))
          ????{
          ?????DeQueue (Q,d);//取出元素
          ?????Push(zhan,c);
          ?????Push(zhan,d);
          ????}
          ????Push(zhan,c);//再次壓入第一個(gè)元素
          ???//?Pop(S,e);//去掉左括號(hào)
          ???}

          ?}
          ?printf("\n解釋的結(jié)果為:? ");
          ??? while(StackEmpty(zhan))//在棧不為空的情況下
          ?{
          ?
          ??Pop(zhan,c);
          ??if(c=='A')
          printf("sae");
          ??????? else
          ???? printf("%c",c);
          ??}
          ??printf("\n");
          }

          ?


          FeedBack:
          # re: 棧和隊(duì)的應(yīng)用-魔王語(yǔ)言解釋 2006-11-29 08:52 kimi
          你的這個(gè)魔王語(yǔ)言不能運(yùn)行的!!!  回復(fù)  更多評(píng)論
            
          # re: 棧和隊(duì)的應(yīng)用-魔王語(yǔ)言解釋 2006-11-29 08:55 kimi
          #include<stdio.h>
          #include<stdlib.h>
          #include<malloc.h>
          #define length 11
          #define STACK_INIT_SIZE 31
          #define OK 1
          #define ERROR 0
          #define OVERFLOW 0
          #define STACKINCREMENT 10
          typedef struct SqStack{
          char *base;
          char *top;
          int stacksize;
          }SqStack;
          int InitStack(SqStack &S){
          S.base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
          if(!S.base) exit (OVERFLOW);
          S.top = S.base;
          S.stacksize = STACK_INIT_SIZE;
          return OK;
          }
          int push(SqStack &S,char e){
          if (S.top - S.base>=S.stacksize){
          S.base = (char *) realloc (S.base,(S.stacksize + STACKINCREMENT) * sizeof (char));
          if (!S.base) return OVERFLOW;
          S.top = S.base + S.stacksize;
          S.stacksize += STACKINCREMENT;
          }
          *S.top++ = e;
          return OK;
          }//push
          int pop(SqStack &S,char &e) {
          if (S.top == S.base) return ERROR;
          e = * --S.top;
          return OK;
          }//Pop
          main()// ½âÊÍħ¹íÓïÑÔ
          {
          char *p,t,y;
          char str[length];
          printf("ÇëÊäÈë×Ö·û´®");
          gets(str);
          p=str;
          SqStack s1,s2;
          InitStack(s1);
          while(*p!='\n')
          {
          switch(*p)
          {
          case'A':{
          t='s';
          push(s1,t);
          t='a';
          push(s1,t);
          t='e';
          push(s1,t);
          } break;
          case'B':{
          t='t';
          push(s1,t);
          t='s';
          push(s1,t);
          t='a';
          push(s1,t);
          t='e';
          push(s1,t);
          t='d';
          push(s1,t);
          t='s';
          push(s1,t);
          t='a';
          push(s1,t);
          t='e';
          push(s1,t);
          } break;
          case'(':{
          char *q,x;
          q=p;
          while(q!=")")
          {
          q++;
          }
          x=*(++p);
          ++p;
          while(p!=q)
          {
          push(s1,x);
          push(s1,*p);
          p++;
          }
          push(s1,x);
          p=++q;
          } break;
          default:push(s1,*p); break;
          p++;
          }
          }
          InitStack(s2);
          while(s1.top!=s1.base)
          {
          pop(s1,y);
          push(s2,y);
          }
          while(s2.top!=s2.base)
          {
          pop(s2,y);
          switch(y)
          {
          case't':printf("Ìì"); break;
          case'd':printf("µØ"); break;
          case's':printf("ÉÏ"); break;
          case'a':printf("Ò»Ö»"); break;
          case'e':printf("¶ì"); break;
          case'z':printf("×·"); break;
          case'g':printf("¸Ï"); break;
          case'x':printf("ÏÂ"); break;
          case'n':printf("µ°"); break;
          case'h':printf("ºÞ"); break;
          }
          }
          return OK;

          }

          麻煩幫忙看一下有什么問(wèn)題,謝謝  回復(fù)  更多評(píng)論
            
          # re: 棧和隊(duì)的應(yīng)用-魔王語(yǔ)言解釋 2006-11-29 09:15 matthew2006
          我的程序運(yùn)行正常,以下為輸出結(jié)果:

          你想要解釋的魔王語(yǔ)言為:B(ehnxgz)B

          解釋的結(jié)果為: tsaedsaeezegexenehetsaedsae
          Press any key to continue...

          編譯環(huán)境:C-Free3.5





            回復(fù)  更多評(píng)論
            
          # re: 棧和隊(duì)的應(yīng)用-魔王語(yǔ)言解釋 2006-12-04 13:49 kimi
          哦,我在C++里運(yùn)行了,所以不行  回復(fù)  更多評(píng)論
            
          # re: 棧和隊(duì)的應(yīng)用-魔王語(yǔ)言解釋 2007-06-01 20:55 qwe
          魔王語(yǔ)言的解釋,求用C++類(class)編  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 渭源县| 龙陵县| 威远县| 广西| 武鸣县| 承德市| 长岭县| 定南县| 上林县| 平邑县| 浮梁县| 商丘市| 盖州市| 新密市| 宁都县| 乌恰县| 靖远县| 龙州县| 锡林浩特市| 铁岭市| 会泽县| 万盛区| 闵行区| 澄迈县| 屏边| 象山县| 南投市| 塔河县| 九龙县| 隆子县| 江华| 长阳| 漾濞| 玛多县| 观塘区| 丹巴县| 福安市| 莫力| 重庆市| 襄城县| 东阳市|