问题描述
有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听懂。但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1) α→β1...βm
(2) (θδ1...δn) →θδnθδn-1...θδ1θ 在这两种形式中,从左到右均表示解释;从右到左均表示抽象。试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
## **基本要求**
用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言解释的词汇,小写字母表示人的语言的词汇;希腊字母表示可以用大写或小写字母代换的变量。魔王语言可含人的词汇。
(1).Β→ tΑdΑ
(2).Α→ sae
测试数据:
B(einxgz)B
解释成 tsaedsaeezegexeneietsaedsae 若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:“天上一个鹅地上一个鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一个鹅地上一个鹅。”
解释:本实验看网上的解法太过于复杂,使用了4个栈的都有,不适合小白做法
### 本代码是用一个栈和一个队列实现;(队列和栈都是利用顺序表实现)
解释:我就不解释了看代码;
代码展示:
说明:使用的IDE是devc++
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
typedef struct{
char *x_stack;
int x_top;
}Stack;
Stack *stackcreat(int size){
Stack *obj=(Stack*)malloc(sizeof(Stack));
obj->x_stack=malloc(sizeof(char)*size);
obj->x_top=0;
return obj;
}
void stackpush(Stack* obj,char x){
obj->x_stack[obj->x_top++]=x;
}
char stackpop(Stack* obj){
obj->x_top--;
return obj->x_stack[obj->x_top];
}
typedef struct{
char* x_stack;
int head;
int rear;
int size;
}queue;
queue* initqueue(int k){
queue* obj=(queue*)malloc(sizeof(queue));
obj->x_stack=(char*)malloc(sizeof(char)*k);
obj->size=k;
obj->head=obj->rear=-1;
return obj;
}
void queuepush(queue*obj,char k){
if(obj->head==-1){
obj->head=0;
}
obj->rear=(obj->rear+1)%obj->size;
obj->x_stack[obj->rear]=k;
}
char queuepop(queue*obj){
char ret=obj->x_stack[obj->head];
if(obj->head==obj->rear){
obj->head=-1;
obj->rear=-1;
return ret;
}
obj->head=(obj->head+1)%obj->size;
return ret;
}
int main()
{
char str[100];
printf("请输入魔王的语言\n");
scanf("%s",str);
int n=strlen(str);
Stack*stack1=stackcreat(100);
queue* queue1=initqueue(100);
for(int i=0;i<n;i++){
if(str[i]=='A'){
stackpush(stack1,'s');
stackpush(stack1,'a');
stackpush(stack1,'e');
}else if(str[i]=='B'){
stackpush(stack1,'t'); //暂时这样写;
stackpush(stack1,'s');
stackpush(stack1,'a');
stackpush(stack1,'e');
stackpush(stack1,'d');
stackpush(stack1,'s');
stackpush(stack1,'a');
stackpush(stack1,'e');
}else if(str[i]==')'){
char pop=stackpop(stack1);
while(pop!='('){
queuepush(queue1,pop);
pop=stackpop(stack1);
}
while(queue1->head!=queue1->rear){
stackpush(stack1,queue1->x_stack[queue1->rear]);
stackpush(stack1,queuepop(queue1));
}
queue1->rear=queue1->head=-1;
}else{
stackpush(stack1,str[i]);
}
}
for(int i=0;i<stack1->x_top;i++){
printf("%c",stack1->x_stack[i]);
}
return 0;
}
结果展示: 测试的为一个括号
括号嵌套测试:
### 结语:
本实验只是临时结果,可以根据不同大写更新规则;还有输出时可以利用中文对应输出真正的人类语言
运行结果:
请输入魔王的语言
A(ad(Bda)A)ad
saeaeaaasasataaataeatadatasataaataeata