数据结构习题集之魔王语言解释

魔王语言解释

问题描述有
一个魔王总是使用自已的一种非常精练而抽象的语言讲话,没有人能听得懂。
但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两种形式
的规则由人的语言逐步抽象上去的:
(1) α→β1β2…βm
(2) (θβ1β2…βm)→(θβm…β2θβ1θ)
在这两种形式中,从左到右均表示解释; 从右到左均表示抽象。
写一个魔王解释程序,将魔王的话解释成人能听懂的话。
基本要求:设大写字母表示魔王语言的词汇,小写字母表示人的词汇,希腊字母表示可以用大写字母或小写字母代换的变量。用下述两种规则和下述规则(2)实现。
(1) B→tAdA
(2) A→sae
测试数据:B(einxgz)B
B(einxgz)B=>tAdA(einxgz)tAdA=>tsaedsae(einxgz)tsaedsae
  => tsaedsaeezegexeneietsaedsae
字母-汉字对应表:
t d s a e z g x n i
天 在 上 一个 鹅 追 赶 下 蛋 恨

链栈结构

#ifndef SQSTACK_H_INCLUDED
#define SQSTACK_H_INCLUDED
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef   int Status;
typedef struct SNode{
     char data;
     struct SNode *next;
}SNode,*StackPtr;

typedef struct {
     StackPtr Base;
     StackPtr Top;
     int Length;
}LinkStack;

Status InitStack(LinkStack *L){
      L->Top=(StackPtr)malloc(sizeof(SNode));
      if(!L->Top)
          exit(-1);
      L->Base=L->Top;
      L->Top->next=NULL;
      L->Length=0;
      return OK;
}

Status Push(LinkStack *L,char C){
      StackPtr New=(StackPtr)malloc(sizeof(SNode));
      if(!New)
             return ERROR;
      New->next=L->Top->next;
      L->Top->next=New;
      New->data=C;
      L->Length++;
      if(L->Length==1)
          L->Base=New;
      return OK;
}

Status Pop(LinkStack *L, char *C){
      if(L->Base==L->Top)
           return ERROR;
      StackPtr Temp;
      Temp=L->Top->next;
      *C=Temp->data;
      if(Temp==L->Base)
      {
          L->Base=L->Top;
          L->Top->next=NULL;
          free(Temp);
      }
      else
      {
          L->Top->next=Temp->next;
          free(Temp);
      }
      L->Length--;
      return OK;
}

Status StackEmpty(LinkStack *L){
      if(L->Top==L->Base&&L->Length==0)
           return TRUE;
      else
          return FALSE;
}
#endif // SQSTACK_H_INCLUDED

链队列结构

#ifndef LINKQUEUE_H_INCLUDED
#define LINKQUEUE_H_INCLUDED
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

typedef   int Status;
typedef struct QNode{
     char data;
     struct QNode *next;
}QNode,*QueuePtr;

typedef struct{
     QueuePtr front;
     QueuePtr rear;
}LinkQueue;

Status InitQueue(LinkQueue *Q){
     Q->front=(QueuePtr)malloc(sizeof(QNode));
     if(!Q->front)
          exit(-1);
     Q->rear=Q->front;
     Q->front->next=NULL;
     return OK;
}

Status EnQueue(LinkQueue *Q,char e){
      QueuePtr P=(QueuePtr)malloc(sizeof(QNode));
      if(!P)
         exit(-1);
      P->data=e;
      P->next=NULL;
      Q->rear->next=P;
      Q->rear=P;
      return OK;
}

Status DeQueue(LinkQueue*Q,char *e){
      if(Q->front==Q->rear)
            return ERROR;
      QueuePtr P=Q->front->next;
      *e=P->data;
       Q->front->next=P->next;
       if(Q->rear==P)
           Q->rear=Q->front;
       free(P);
       return OK;
}

Status QueueLength(LinkQueue *Q){
       QueuePtr P=Q->front->next;
       int num=1;
       while(P->next!=NULL)
       {
           num++;
           P=P->next;
       }
       return num;
}

Status QueueEmpty(LinkQueue *Q){
      if(Q->front==Q->rear)
          return TRUE;
      else
          return  FALSE;
}

#endif // LINKQUEUE_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SqStack.h"
#include "LinkQueue.h"

typedef struct {
     char A;
     char B[10];
}Rule,*Rules;
Rules R;
int N;

 typedef struct{
      char Words[40];
      int  Length;
 }Devilwords;
 Devilwords W;
 LinkStack  L;
 LinkQueue Q;

void Start(){
      scanf("%d",&N);
      getchar();
      InitStack(&L);
      InitQueue(&Q);
      return;
}

void RulesIn(){
      R=(Rules)malloc(N*sizeof(Rule));
      for(int i=0;i<N;i++)
      {
        scanf("%c-->%s",&R[i].A,R[i].B);
        getchar();
      }
      return;
}

void  DevilSay(){
      printf("比克大魔王说凶残地说: \n");
      scanf("%s",W.Words);
      W.Length=strlen(W.Words);
      return;
}
void PreDeal(){
      int i=W.Length-1;
      while(i>=0){
        char e;
        if(W.Words[i]=='(')
        {
            Pop(&L,&e);
            char theta;
            while(1){
                Pop(&L,&theta);
                if(theta==')')
                     break;
                EnQueue(&Q,theta);
            }
            while(!QueueEmpty(&Q)){
                DeQueue(&Q,&theta);
                Push(&L,e);
                Push(&L,theta);
            }
            Push(&L,e);
        }
        else
            Push(&L,W.Words[i]);
        i--;
      }
      return;
}

void MidDeal(){
      char e;
      for(int i=0;i<N;i++){
           if(i==0)
           {
               while(!StackEmpty(&L))
               {
                   Pop(&L,&e);
                   if(e==R[i].A)
                   {
                       int j=0;
                       while(R[i].B[j]!='\0')
                       {
                           EnQueue(&Q,R[i].B[j]);
                           j++;
                       }
                   }
                   else
                     EnQueue(&Q,e);
               }
           }
           else
           {
                EnQueue(&Q,'$');
                while(1)
                {
                    DeQueue(&Q,&e);
                    if(e=='$')
                        break;
                    if(e==R[i].A)
                    {
                       int j=0;
                       while(R[i].B[j]!='\0')
                       {
                           EnQueue(&Q,R[i].B[j]);
                           j++;
                       }
                    }
                    else
                        EnQueue(&Q,e);
                }
           }
      }
      return;
}
void Translate(){
      char e;
      while(!QueueEmpty(&Q))
      {
          DeQueue(&Q,&e);
          switch(e)
          {
              case   't':  printf("天");break;
              case  'd':  printf("地");break;
              case  's':  printf("上");break;
              case  'a':  printf("一只");break;
              case  'e':  printf("鹅");break;
              case  'z':  printf("追");break;
              case  'g':  printf("赶");break;
              case  'x':  printf("下");break;
              case  'n':  printf("蛋");break;
              case  'h':  printf("恨");break;
              default :  printf("错误警告\n");break;
          }
      }
      return;
}
int main()
{
    system("Color 0e");
    Start();
    RulesIn();
    DevilSay();
    PreDeal();
    MidDeal();
    Translate();
    return 0;
}


在这里插入图片描述

posted on 2019-04-27 01:09  偷影子的人儿  阅读(308)  评论(0编辑  收藏  举报