<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ù)  更多評論
      
    主站蜘蛛池模板: 成全影视免费观看大全二| 精品97国产免费人成视频| 亚洲一级毛片在线观| 亚洲一二成人精品区| 亚洲电影中文字幕| 亚洲综合无码一区二区| 亚洲图片在线观看| 亚洲乱码一二三四区麻豆| 亚洲天堂一区在线| 亚洲伦理中文字幕| 亚洲AV无码无限在线观看不卡| 国产精品亚洲综合五月天| 久久亚洲精品国产亚洲老地址| 亚洲高清视频在线| 青草青草视频2免费观看| 一进一出60分钟免费视频| 久久一区二区免费播放| 久久久免费的精品| 1000部禁片黄的免费看| 国内精品乱码卡1卡2卡3免费| 性色av无码免费一区二区三区| 永久免费毛片手机版在线看| 亚洲AV蜜桃永久无码精品| 国产亚洲精品高清在线| 亚洲丁香色婷婷综合欲色啪| 亚洲国产精品日韩在线| 理论亚洲区美一区二区三区| 永久免费精品影视网站| 日本免费高清视频| 日本精品人妻无码免费大全| 国产免费拔擦拔擦8x| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 中文字幕在线亚洲精品 | 久久久久久99av无码免费网站| 午夜影视在线免费观看| 亚洲国产成人久久综合区| 亚洲AV无码专区亚洲AV伊甸园 | 亚洲成a人片在线观看日本麻豆| 国产成人综合亚洲AV第一页| 亚洲成人激情在线| 亚洲人成色在线观看|