魔王语言解释

[问题描述]   
有一个魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听的懂。但他的语言是可以逐步解释成人能懂得语言的,因为他的语言是由以下两种形式的规则由人的语言逐 步抽象上去的:    
  (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;
}

  • 3
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值