魔王语言的解释
c语言
数据结构
【问题描述】
有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1)a→12
(2)(0128n)→08n0n-188
在这两种形式中,从左到右均表示解释。试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
【基本要求】
用下述两条具体规则和上述规则形式(2)实现设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量魔王语言可含人的词汇。
(1)b→tAda
(2)a→sae
【实现提示】
将魔王的语言自右至左进栈,总是处理栈顶字符若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈其他情形较简单,请读者思考应如何处理。应首先实现栈和队列的基本操作。
代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
#define overflow_error -1typedef char SElemType;//栈元素类型//-----栈的顺序存储表示------
typedef struct
{
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//当前已分配的存储空间
}SqStack;//------基本操作的函数原型说明------
int InitStack(SqStack *S);//构造一个空栈
//int DestroyStack(SqStack *S);//销毁栈S,S不在存在
int Push(SqStack *S, SElemType e);//插入元素e为新的栈顶元素
int Pop(SqStack *S, SElemType *e);//若栈不空,则删除S的栈顶元素,用e返回其值int main()
{
char e, temp, Sb;
SqStack S;
InitStack(&S);//栈的定义以及初始化
printf(“依次输入魔王语言的所有内容(只能包含大小写字母以及括号),以换行键结束,”
“翻译的结果会在输入完的下一行自动给出。\n”);
do{//循环输入魔王语言的每个字母并将括号里的内容如栈
//括号外的内容直接翻译并输出
scanf("%c", &e);
Push(&S, e);
if(e == ‘(’){
Pop(&S, &temp);
scanf("%c", &Sb);
Push(&S, Sb);
do{//对括号里所有内容做入栈处理
scanf("%c", &e);
Push(&S, e);
}while(e != ‘)’);
Pop(&S, &temp);
}
if(e == ‘A’){//括号外输入A时所作的翻译
printf(“sae”);
Pop(&S, &temp);
}
else if(e == ‘B’){//括号外是B时所作的翻译
printf(“tsaedsae”);
Pop(&S, &temp);
}
else if(e == ‘)’){
do{//对栈内内容的翻译
Pop(&S, &temp);
if(temp == ‘\n’)continue;
if(S.base != S.top)
printf("%c%c", Sb, temp);
else printf("%c", temp);
}while(S.base != S.top);
}
else printf("%c", e);
}while(e != ‘\n’);
return 0;
}//------基本操作函数的实现------
int InitStack(SqStack S)//构造一个空栈
{
S->base = (SElemType)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S->base)exit(overflow_error);//存储空间分配失败
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return 1;
}int Push(SqStack S, SElemType e)
{
if(S->top - S->base >= S->stacksize)//栈满,追加存储空间
{
S->base = (SElemType)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!S->base)exit(overflow_error);//存储空间分配失败
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++ = e;
return 1;
}int Pop(SqStack *S, SElemType *e)
{
if(S->base == S->top)return 0;//弹出失败,栈为空栈
*e = *–S->top;
return 1;
}
魔王语言解释 c语言 数据结构