您的位置:首页 > 其它

魔王语言翻译

2017-12-27 21:32 513 查看
魔王语言翻译
计算机实现

魔王语言翻译

问题描述:

魔王的语言是由以下两种形式的规则由人的语言逐步抽象上去的。

(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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: