魔王语言翻译

魔王语言翻译

问题描述:
魔王的语言是由以下两种形式的规则由人的语言逐步抽象上去的。
(1)α–>β(1)β(2)β(3)….β(m)
(2)(θδ(1)δ(2)δ(3)…δ(n))–>θδ(n)θδ(n-1)…θδ(1)θ
(括号内数字为下标),上面的规则中,从左到右表示将魔王的语言翻译成人类的语言。魔王语言和人类语言按照该语法规则进行转换。设大写字母表示魔王语言词汇,小写字母表示人类语言词汇。上述的希腊文法式中,希腊字母表示可以用大写字母或小写字母代换的变量。魔王语言可以包含人类词汇。
(1)B–>tAdA
(2)A–>sae
编写一个魔王语言的翻译系统,把魔王的话翻译成人类语言。

题目分析:
魔王的语言组成是这样的:由大写字母组成;由小写字母组成;由大写小写字母混合组成;由包括括号的字母组成。其中大写字母与小写字母的关系为:B–>tAdA,A–>sae。因此魔王语言中的大写字母只能包含A和B两个。

例如:
B翻译为:tsaedsae;
(abc)翻译为:acaba;
A(Aasc)B翻译为:sae saec saes saea sae tsaedsae(没有空格,只是为了看着更清晰明了)

计算机实现

我们可以这样考虑,将输入的魔王语言从右至左进栈,每次从栈顶弹出一个元素,进而对该元素处理,重点是对括号内的元素进行处理。
如果遇到左括号(,则要将括号里的内容从栈中取出,按语法规定的顺序从右至左进入一个新栈,在每次从栈顶弹出一个元素,递归调用该处理过程。


程序如下:

#include"stdio.h"
    #define STACK_INIT_SIZE 20
    #define STACKINCREMENT 10
    typedef char Elemtype;
    typedef struct{         //定义一个栈类型
       Elemtype *top;
       Elemtype *base;
       int stacksize;
    }sqstack;

    initstack(sqstack *s)
    { 
         /*在内存中开辟一段连续空间作为栈空间,首地址赋值给s->base*/
         s->base=(Elemtype *)malloc(sizeof(Elemtype)* STACK_INIT_SIZE );
         if(!s->base) exit(0);     //分配内存失败
         s->top=s->base;          //最开始栈顶就是栈底
         s->stacksize=STACK_INIT_SIZE;
    }

    //进栈操作
    Push(sqstack *s,Elemtype e)
    {
          if(s->top-s->base>=stscksize)     //栈满,追加空间
          s->base=(Elemtype *)realloc(s->base,sizeeof(Elemtype)*(s->stacksize+STACKINCREMENT));
          if(!s->base) exit(0);
          s->top=s->base+s->stacksize;
          s->stacksize=s->stacksize+STACKINCREMENT;
          *(s->top)=e;
          s->top++;
    }

    //出栈操作
    Pop(sqstack *s,Elemtype *e)
    {
        if(s->top==s->base) return;
        *e=*--(s->top);       //修改栈顶指针,栈顶指针不指向元素,指在栈中最高元素的上面
    }

    //获得栈的大小
    int stacklen(sqstack *s)
    {
       return (s->top-s->base);
    }

    void translate(Elemtype e,sqstack *s)
    {
        Elemtype c,a;
        sqstack ss1;
        if(e>=97&&e<=122)
           printf("%c",e);
        else if(e=='A') 
          printf("%s","sae");
        else if(e=='B')
          printf("%s","tsaedsae");
        else if(e=='(')
       {
          intistack(&ss1);      //初始化栈ss1
          Pop(&(*s),&c);        //注意*s相当于主函数中的s
          a=c;                 //保留括号后的第一个元素
          Pop(&(*s),&c);
          while(c!=')')
          {
             Push(&ss1,a);
             Push(&ss1,c);
             Pop(&(*s),&c);
          }
          Push(&ss1,a);
          //翻译括号里的内容
          while(stacklen(ss1))
          {
              Pop(&(*ss1),&c);
              translate(c,*ss1);
          }
       }   
    }

    main()
    {
        Elemtype e;
        sqstack s1,s2;
        initstack(&s1);
        printf("Please input Devil language:\n");
        scanf("%c",&e);
        while(e!='#')
        {
            if(e=='A'||e=='B'||(e>=97&&e<=122)||e=='('||e==')')
            {
               Push(&s1,e);
            }
            scanf("%c",&e);
        }
        initstack(&s2);      //初始化s2
        while(stacklen(s1))
        {
           Pop(&s1,&e);
           Push(&s2,e);    //重点:将魔王语言从右至左入栈s2,在输入时无法一步达到从右至左入栈,所以要用两个栈导一下
        }
        printf("The mankind language is:\n");
        //最终输入的魔王语言存放在栈s2中,处理栈顶元素进行翻译
        while(stacklen(s2))
        {
           Pop(&s2,&e);
           translate(e,&s2);
        }
        getche();
    }
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值