魔王语言
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实习报告
题目:魔王语言
班级:09052713 姓名:练军学号:09054130完成日期:2010.12
一、需求分析
1.问题描述
有一个魔王总是使用自已的一种非常精练而抽象的语言讲话,没有人能听得懂。但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α→β1β2…βm
(2)(θβ1β2…βm)→(θβm…β2θβ1θ)
在这两种形式中,从左到右均表示解释。写一个魔王解释程序,将魔王的话解释成人能听懂的话。
2.基本要求
用下述两种规则和下述规则(2)实现。设大写字母表示魔王语言的词汇,小写字母表示人的词汇,希腊字母表示可以用大写字母或小写字母代换的变量。魔王语言可含人的词汇。
(1) B→tAdA
(2) A→sae
3. 测试数据
B(einxgz)B解释成tsaedsaeezegexeneietsaedsae
若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。
将魔王的语言自右至左进栈,总是处理栈顶字符。若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列在处理后入栈。
二、概要设计
ADT Stack
{
数据对象:D = { a i | a i∈char, i = 1,2,3……,n, n≥0}
数据关系:R 1 = { | a i-1,a i∈D,i = 2,……n}
约定a n端为栈顶,a1端为栈底。
基本操作:
InitStack(&s)
操作结果:构造一个空栈s。
DestroyStack(&s)
初始条件:栈s已存在。
操作结果:栈s被销毁。
Push(&s,e)
初始条件:栈s已存在。
操作结果:插入元素e为新的栈顶元素。
Pop(&s,&e)
初始条件:栈s已存在。
操作结果:删除s的栈顶元素,并用e返回其值。
}ADT Stack
ADT Queue
{
数据对象:D = { a i | a i∈char, i = 1,2,3……,n, n≥0} 数据关系:R 1 = { | a i-1,a i∈D,i = 2,……n}
约定其中a1端为队列头,a n端为队列尾。基本操作:
InitQueue(&q)
操作结果:构造一个空队列q。
DestroyQueue(&q)
初始条件:队列q已存在。
操作结果:队列q被销毁,不再存在。
Enqueue(&q,e)
初始条件:队列q已存在。
操作结果:插入元素e为q的新的队尾元素。
Dequeue(&q,&e)
初始条件:队列q已存在。
操作结果:删除q的队头元素,并用e返回其值。
}ADT Queue
主程序:
void main()
{
for()
{
处理命令;
}
Switch()
{
处理命令;
}
}
三、详细设计
#include
#include
#include
#include
#define MAXSIZE 100
#define STACK_INIT_MAX 100
#define STACKINCREMENT 10
#define ERROR 0
#define OK 1
#define FALSE 0
#define TRUE 1
typedef int Status;
char lang[MAXSIZE]; //全局数组变量,用于存储魔王语言typedef struct
{ //顺序栈类型定义
char *top;
char *base;
int stacksize;
}SqStack;
Status InitStack(SqStack &s)
{ //构造一个空栈s
s.base=(char
*)malloc(STACK_INIT_MAX*sizeof(char));
if(!s.base) exit(OVERFLOW); //存储分配失败
s.top = s.base;
s.stacksize = STACK_INIT_MAX;
return OK;
}
Status Pop(SqStack &s,char &e)
{ //删除s的栈顶元素,并以e返回其值
if(s.top == s.base) return FALSE;
s.top--;
e = *(s.top);
return TRUE;
}
Status Push(SqStack &s,char e)
{ //在栈s的栈顶插入新的栈顶元素e
if((s.top-s.base) >= s.stacksize)
{
s.base=(char
*)realloc(s.base,(s.stacksize+STACKINCREMENT) * sizeof(char));
if(!s.base) exit(OVERFLOW); //存储分配失败
s.top = s.base + s.stacksize;
s.stacksize += STACKINCREMENT;
}
*s.top = e;
s.top++;
return OK;
}
Status DestroyStack(SqStack &s)
{ //销毁栈s
free(s.base);
s.stacksize = 0;
return OK;
}