[问题描述]
有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听的懂。但他的语言是可以逐步解释成人能懂得语言的,因为他的语言是由以下两种形式的规则由人的语言逐 步抽象上去的:
(1)α->β1β2...βn
(2)(θδ1δ2...δn)->θδnθδn-1...θδ1θ
在这两种形式中,从左到右均表示解释;从右到左表示抽象。试写一个魔王解释系统,把他的话解释成人能听懂得话。
有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听的懂。但他的语言是可以逐步解释成人能懂得语言的,因为他的语言是由以下两种形式的规则由人的语言逐 步抽象上去的:
(1)α->β1β2...βn
(2)(θδ1δ2...δn)->θδnθδn-1...θδ1θ
在这两种形式中,从左到右均表示解释;从右到左表示抽象。试写一个魔王解释系统,把他的话解释成人能听懂得话。
[基本要求]
用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言的词汇;小写字
母表示人的语言词汇;希腊字母(a,b1,s,y1等)表示可以用大写或小写字母代换的变量。
魔王语言可含人的词汇。
(1)B->tAdA
(2) A->sae
[测试数据]
B(einxgz)B
解释成 tsaedsaeezegexeneietsaedsae
[实现提示]
将魔王的语言自右至左进栈,总是处理栈顶。若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。应首先实现栈和队列的基本运算。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef char StackData,QueueData;
typedef struct node{
StackData data;
struct node *link;
}StackNode,QueueNode;//栈和队列结点定义是一样的
typedef struct linkStack{
StackNode* top;
}LinkStack;
typedef struct{
QueueNode *rear,*front;
}LinkQueue;
void InitStack(LinkStack *s)//初始化栈
{
s->top=NULL;
}
int Push(LinkStack *S,StackData x) //入栈
{
StackNode *p=(StackNode*)malloc(sizeof(StackNode));
if(!p) return 0;
p->data=x;
p->link=S->top;
S->top=p;
return 1;
}
int PoP(LinkStack *s,StackData *x) //出栈
{
if(s==NULL||s->top==NULL)
return 0;
StackNode *p=s->top;
*x=p->data;
s->top=p->link;
free(p);
return 1;
}
void InitQueue(LinkQueue *q) //初始化队列
{
q->rear=q->front=NULL;
}
int EnQueue(LinkQueue *Q,QueueData x)//进队列
{
QueueNode *p=(QueueNode*)malloc(sizeof(QueueNode));
if(!p) return 0;
p->data=x;
p->link=NULL;
if(Q->front==NULL) //队列为空,创建第一个结点
Q->front=Q->rear=p;
else
Q->rear->link=p;
Q->rear=p;
return 1;
}
int DeQueue(LinkQueue *Q,QueueData *x)//出队列
{
if(Q->front==NULL) return 0;//队空
QueueNode *p=Q->front;
*x=p->data;
Q->front=Q->front->link;
free(p);
return 1;
}
int main(int argc, const char * argv[]) {
char c;
char demon[MAX_SIZE];
char data;
LinkStack S;
LinkQueue Q;
InitQueue(&Q);
InitStack(&S);
int i=0;
while((c=getchar())!='#') //输入#结束
{
demon[i]=c;
i++;
}
for(int j=i-1;j>=0;j--) //数组自右向左逐一进栈
Push(&S,demon[j]);
while(PoP(&S,&data))//出栈操作
{
if(data=='A')
printf("sae");
else if(data=='B')
printf("tsaedsae");
else if(data=='(')
{
char frontdata;
while(data!=')')
{
PoP(&S,&data);
EnQueue(&Q, data);
}
DeQueue(&Q,&data); //出首元素
frontdata=data;
while(DeQueue(&Q, &data))
{
Push(&S,frontdata);
Push(&S,data);
}
}
else if(data==')')
{}//不打印左括号
else
printf("%c",data);
}
return 0;
}