魔王语言实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
魔王语言实验报告本页仅作为文档页封面,使用时可以删除
This document is for reference only-rar21year.March
数据结构实验报告
(魔王语言)
一、【实验构思(Conceive)】(10%)
(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)
魔王语言的解释规则:
大写字母表示魔王语言的词汇,小写字母表示人的词汇语言,魔王语言中可以包含括号,魔王语言的产生式规则在程序中给定,当接收用户输入的合法的魔王语言时,通过调用魔王语言翻译函数来实现翻译。
二、【实验设计(Design)】(20%)
(本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)
抽象数据类型:typedef struct
{StackElementType elem[Stack_Size]; int top;
}SeqStack;
主程序模块:int main()
{
GhostLanage();
printf("\n\t按任意键退出\n\n");
}
各子程序模块:/*初始化栈*/
void InitStack(SeqStack *s)
{s->top=-1;
}
/*进栈操作*/
void Push(SeqStack *s,StackElementType x)
{if(s->top==Stack_Size-1)
printf("\n\t栈已满! ");
else {s->top++;s->elem[s->top]=x;}
}
/*出栈操作*/
void Pop(SeqStack *s,StackElementType *x)
{if(s->top==-1)
printf("\n\t栈为空! ");
else {*x=s->elem[s->top];s->top--;}
}
/*取栈顶元素*/
void GetTop(SeqStack *s,StackElementType *x) {if(s->top==-1)
printf("\n\t栈为空! ");
else *x=s->elem[s->top];
}
/*判断栈是否为空*/
int IsEmpty(SeqStack *s)
{if(s->top==-1) return(0);
else return(1);
}
/*魔王语言翻译函数*/
void GhostLanage()
{SeqStack B,A,s,B1,A1,r,M;
StackElementType ch,ch1,ch2,x;
char aa[100];
int choice,i=0,n;
InitStack(&B);InitStack(&A);InitStack(&s);InitStack(&r);
InitStack(&M);
printf("魔王语言的转换形式: B->tAdA A->sae");
Push(&B,'t');
Push(&B,'A');
Push(&B,'d');
Push(&B,'A');
Push(&A,'s');
Push(&A,'a');
Push(&A,'e');
printf("\n请输入要翻译的魔王语言:\n");
scanf("%s",aa);
for(i=0;aa[i]!='\0';i++)
Push(&s,aa[i]);
while(IsEmpty(&s))
{Pop(&s,&ch);
if(ch=='B')
{B1=B;
while(IsEmpty(&B1))
{Pop(&B1,&ch1);
if(ch1=='A')
{A1=A;
while(IsEmpty(&A1))
{Pop(&A1,&ch2);
Push(&r,ch2);
}
}
else Push(&r,ch1);
}
}
else if(ch=='A')
{A1=A;
while(IsEmpty(&A1)) {Pop(&A1,&ch2); Push(&r,ch2);
}
}
else if(ch==')')
{Pop(&s,&ch2);
while(ch2!='(')
{Push(&M,ch2);
Pop(&s,&ch2);
}
GetTop(&M,&ch2);
x=ch2;
Pop(&M,&ch2);
while(IsEmpty(&M))
{Push(&r,x);
Pop(&M,&ch2);
Push(&r,ch2);
}
Push(&r,x);
}
else Push(&r,ch);
}
M=r;
printf("\n\n\t翻译的结果为: ");
while(IsEmpty(&M))
{Pop(&M,&ch);
printf("%c",ch);
}
printf("\n\n\t是否继续翻译为汉语:( 1-继续,0-不继续)"); scanf("%d",&n);
if(n==1)
{ printf("\n\n\t翻译为汉语的结果为: \n\n\t");
M=r;
while(IsEmpty(&M))
{Pop(&M,&ch);
if(ch=='t') printf("天");
else if(ch=='d') printf("地");
else if(ch=='s') printf("上");
else if(ch=='a') printf("一只");
else if(ch=='e') printf("鹅");