<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

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

    留言簿(14)

    隨筆分類

    收藏夾

    My Favorite Web Sites

    名Bloger

    非著名Bloger

    搜索

    •  

    積分與排名

    • 積分 - 202413
    • 排名 - 285

    最新評論

    問題描述:

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

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

    實現代碼如下:

    #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;???????????? //棧頂地址
    ?int stacksize;
    }SqStack;
    typedef struct QNode{
    ?QElemType data;
    ?struct QNode *next;
    }QNode,*QueuePtr;
    typedef struct{
    ?QueuePtr front;?? //隊頭指針
    ?QueuePtr rear;??? //隊尾指針
    }LinkQueue;
    Status InitStack(SqStack &S)
    //構造一個空棧
    {
    ?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)
    //構造一個空隊列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=='(')//如果為右括號,則輸出括號中所有內容
    ???{
    ????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解釋的結果為:? ");
    ??? 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 閱讀(4078) 評論(5)  編輯  收藏 所屬分類: 數據結構與算法設計

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

    }

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

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

    解釋的結果為: tsaedsaeezegexenehetsaedsae
    Press any key to continue...

    編譯環境:C-Free3.5





      回復  更多評論
      
    # re: 棧和隊的應用-魔王語言解釋 2006-12-04 13:49 kimi
    哦,我在C++里運行了,所以不行  回復  更多評論
      
    # re: 棧和隊的應用-魔王語言解釋 2007-06-01 20:55 qwe
    魔王語言的解釋,求用C++類(class)編  回復  更多評論
      
    主站蜘蛛池模板: 亚洲国产精品日韩在线观看 | 日本高清不卡中文字幕免费| 亚洲AV无码国产在丝袜线观看| 免费无码午夜福利片 | 亚洲乱码一区二区三区在线观看| 亚洲AV美女一区二区三区| 亚洲人成网站看在线播放| jzzjzz免费观看大片免费| 免费永久国产在线视频| 亚洲精品日韩一区二区小说| 免费黄色app网站| 亚洲精品国产肉丝袜久久| 久久一区二区三区免费播放| 免费久久精品国产片香蕉| 国产综合激情在线亚洲第一页| 无码国产精品一区二区免费 | 国产一区二区三区在线观看免费| 亚洲av午夜国产精品无码中文字 | 337p日本欧洲亚洲大胆色噜噜| 一区二区三区观看免费中文视频在线播放 | 国产免费av片在线看| 亚洲人成伊人成综合网久久久| 中文字幕视频在线免费观看| 亚洲天堂男人天堂| 黄床大片免费30分钟国产精品| 亚洲人成网7777777国产| 57pao一国产成永久免费| 中文有码亚洲制服av片| 亚洲v国产v天堂a无码久久| 久久国产精品免费一区| 久久精品国产亚洲av高清漫画| 久久青草精品38国产免费| 亚洲国产精品张柏芝在线观看 | 亚洲国产精品丝袜在线观看| 国产精品偷伦视频观看免费| 亚洲精品无码mv在线观看网站| 98精品全国免费观看视频| 亚洲AV无码精品无码麻豆| 中文字幕无码播放免费| 日本高清免费中文在线看| 亚洲精品在线免费看|