<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

    留言簿(14)

    隨筆分類

    收藏夾

    My Favorite Web Sites

    名Bloger

    非著名Bloger

    搜索

    •  

    積分與排名

    • 積分 - 202516
    • 排名 - 285

    最新評論

    問題描述:

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

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

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

    #include<stdlib.h>
    #include<stdio.h>
    #define STACK_INIT_SIZE 100 //存儲空間初始分配量
    #define STACK_INCREMENT? 10? //存儲空間分配增量
    #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;?? //隊頭指針
    ?QueuePtr rear;??? //隊尾指針
    }LinkQueue;
    Status InitStack(SqStack &S)
    //構(gòu)造一個空棧
    {
    ?S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(char));
    ?if(!S.base)
    ??exit (OVERFLOW);//存儲單元分配失敗
    ?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)
    ?{//棧滿,追加存儲空間
    ??S.base=(SElemType *)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(char));
    ?if(!S.base)
    ??exit (OVERFLOW);//存儲單元分配失敗
    ?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)造一個空隊列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的新的隊尾元素
    {
    ?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)
    //若隊列不空,則刪除Q的隊頭元素,用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)
    //若隊列Q為空隊列,則返回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++);//計算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("你想要解釋的魔王語言為:%s\n",mowang);
    ??? char? B[]="tAdA";
    ?InitStack(S);
    ?InitStack(zhan);
    ?InStack(mowang,S);//全部壓進棧中
    ?while(StackEmpty(S))//在棧不為空的情況下
    ?{
    ??Pop(S,e);
    ??if(e=='B')
    ??InStack(B,zhan);
    ??else
    if(e=='(')//如果為右括號,則輸出括號中所有內(nèi)容
    ???{
    ????while(Pop(S,e)&&e!=')')//當為左括號時停止
    ????{
    ?????if(e!=')')
    ?????EnQueue (Q,e);
    ????}
    ?????DeQueue (Q,c);//讀出隊列中第一個元素
    ????while(QueueEmpty(Q))
    ????{
    ?????DeQueue (Q,d);//取出元素
    ?????Push(zhan,c);
    ?????Push(zhan,d);
    ????}
    ????Push(zhan,c);//再次壓入第一個元素
    ???//?Pop(S,e);//去掉左括號
    ???}

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

    ?

    posted on 2006-10-14 19:18 matthew 閱讀(4079) 評論(5)  編輯  收藏 所屬分類: 數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計

    FeedBack:
    # re: 棧和隊的應(yīng)用-魔王語言解釋 2006-11-29 08:52 kimi
    你的這個魔王語言不能運行的!!!  回復(fù)  更多評論
      
    # re: 棧和隊的應(yīng)用-魔王語言解釋 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;

    }

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

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

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

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





      回復(fù)  更多評論
      
    # re: 棧和隊的應(yīng)用-魔王語言解釋 2006-12-04 13:49 kimi
    哦,我在C++里運行了,所以不行  回復(fù)  更多評論
      
    # re: 棧和隊的應(yīng)用-魔王語言解釋 2007-06-01 20:55 qwe
    魔王語言的解釋,求用C++類(class)編  回復(fù)  更多評論
      
    主站蜘蛛池模板: 亚洲国产系列一区二区三区| 亚洲七七久久精品中文国产| 91亚洲国产成人精品下载| 国产高潮流白浆喷水免费A片 | 国产精品99久久免费| 亚洲色www永久网站| 青青青国产在线观看免费| 久久精品国产亚洲av高清漫画| 免费成人高清在线视频| 亚洲AV美女一区二区三区| 三年片在线观看免费观看大全一| 亚洲国产精品无码久久久不卡| 老司机69精品成免费视频| 久久亚洲熟女cc98cm| 妻子5免费完整高清电视| 亚洲人成网站999久久久综合| 免费观看的a级毛片的网站| 特黄特色大片免费| 久久亚洲AV无码西西人体| 国产精品偷伦视频观看免费| 亚洲性无码av在线| 日本免费人成黄页在线观看视频 | 日韩a在线观看免费观看| 极品色天使在线婷婷天堂亚洲 | 亚洲avav天堂av在线不卡| 最近免费中文字幕大全免费版视频 | 老妇激情毛片免费| 日日噜噜噜噜夜夜爽亚洲精品| 免费成人在线视频观看| 亚洲一级黄色大片| 亚洲国产精品尤物yw在线| a级毛片毛片免费观看永久| 亚洲一级片在线观看| 亚洲av无码成人精品区在线播放| 97在线视频免费公开视频| 亚洲中文字幕无码av在线| 亚洲成A∨人片天堂网无码| 免费国产成人18在线观看| 亚洲欧美综合精品成人导航| 亚洲国产中文字幕在线观看 | 久久99亚洲网美利坚合众国|