⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 魔王语言解释.cpp

📁 本程序中
💻 CPP
字号:
#include<stdio.h>
#include<iostream.h>
#include<malloc.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

#define STACK_INIT_SIZE 100
#define STACK_INCREMENT  10

struct Stack
{char* base;
 char* top;
 int stacksize;
};

struct Queue
{char data;
 struct Queue* next;
};

struct LinkQueue
{struct Queue* front;
 struct Queue* rear;
};

//构造空栈
void InitStack(Stack &s)
{s.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
 s.top=s.base;
 s.stacksize=STACK_INIT_SIZE;
}

//元素入栈
void Push(Stack &s,char e)
{if(s.top-s.base>=STACK_INIT_SIZE)
 {s.base=(char*)realloc(s.base,(s.stacksize+STACK_INCREMENT)*sizeof(char));           
  s.top=s.base+s.stacksize;
  s.stacksize+=STACK_INCREMENT;
 }
 *(s.top)=e;
 s.top++;
}

//元素出栈
void Pop(Stack &s,char &e)
{e=*--s.top;
}

//判断栈是否为空
int StackEmpty(struct Stack s)
{if(s.top==s.base){return 1;}
 else{return 0;}
}

//清空栈
void ClearStack(Stack &s)
{s.top=s.base;
}

//构造空队列
void InitQueue(LinkQueue &q)
{q.front=q.rear=(struct Queue*)malloc(sizeof(struct Queue));
 q.front->next=NULL;
}

//元素入队
void EnQueue(LinkQueue &q,char e)
{struct Queue* p;
 p=(struct Queue*)malloc(sizeof(struct Queue));
 p->data=e;
 p->next=NULL;
 q.rear->next=p;
 q.rear=p;
}

//元素出队
void DeQueue(LinkQueue &q,char &e)
{struct Queue* p;
 p=q.front->next;
 e=p->data;
 q.front->next=p->next;
 if(q.rear==p){q.rear=q.front;}
 free(p);
}

//判断队列是否为空
int QueueEmpty(LinkQueue q)
{if(q.front==q.rear){return 1;}
 else{return 0;}
}

//把字符数组从右至左存入栈中
void InStack(Stack &s,char* ch)
{int i,L=0;
 while(ch[L]!='\0'){L++;}
 for(i=L-1;i>=0;i--){Push(s,ch[i]);}
}

int main()
{int i=0,j,mark=1,f=0;
 char A[]="sae",B[]="tsaedsae",MoWang[100]="\0",e1,key,e2,e,flag='0';//flag用来标记处理括号
 struct Stack S;
 struct Stack temp;//用来处理括号外的元素
 struct LinkQueue Q;
 InitStack(S);
 InitStack(temp);
 InitQueue(Q);
 do
 {system("cls");
  cout<<"████████████████████████████████████████";
  cout<<"█                                                                            █";
  cout<<"█                                魔王语言解释                                █";
  cout<<"█                                                                            █";
  cout<<"████████████████████████████████████████";
  cout<<"█                                                                            █";
  cout<<"█                                1. 进行解释                                 █";
  cout<<"█                                                                            █";
  cout<<"█                                2. 退出                                     █";
  cout<<"█                                                                            █";
  cout<<"████████████████████████████████████████";
  cout<<endl<<"请输入你的选择(输入1-2以外字符将结束程序):";
  cin>>j;
  if(j==1)
  {system("cls");cout<<"请输入你想要解释的魔王语言(最多含有一个括号):"<<endl;
   cin>>MoWang;
   InStack(S,MoWang);//把要解释的魔王语言存入栈中
   while(!StackEmpty(S))
   {Pop(S,e1);
    if(e1=='(')
    {if(StackEmpty(S))
     {cout<<"魔王语言错误,程序退出!"<<endl;
      mark=0;
      break;
     }
     while(!StackEmpty(S))
     {Pop(S,e1);
      if(e1==')'){f=1;break;}
      else if(!(e1>='a'&&e1<='z')&&!(e1>='A'&&e1<='Z'))
	  {cout<<"魔王语言错误,程序退出!"<<endl;
       mark=0;
       break;
	  }                
     }
     if(mark==0){break;}
     if(f!=1)
     {cout<<"魔王语言错误,程序退出!"<<endl;
      break;
     }            
    } 
    else if(e1==')')
    {cout<<"魔王语言错误,程序退出!"<<endl;
     mark=0;
     break;
    } 
    else if(!(e1>='a'&&e1<='z')&&!(e1>='A'&&e1<='Z'))
    {cout<<"魔王语言错误,程序退出!"<<endl;
     mark=0;  
     break;   
    }     
   }
   if(mark==1&&f==1)
   {ClearStack(S);
    InStack(S,MoWang);
    while(!StackEmpty(S))
    {Pop(S,e1);
     if(e1=='B'){Push(temp,e1);}
     else if(e1=='A'){Push(temp,e1);}
     else if(e1=='(')//用队存储括号中的元素
     {Push(temp,flag);//有括号的话就用flag标记               
      Pop(S,e1);
      while(e1!=')')
      {EnQueue(Q,e1);
       Pop(S,e1);
      }
      if(!QueueEmpty(Q)){DeQueue(Q,key);}            
     }
     else
     {Push(temp,e1);
      f=0;
     }
    }
    while(!StackEmpty(temp))
    {Pop(temp,e1);
     if(e1!=flag){Push(S,e1);}//把括号外的元素存入栈中
     else
     {while(!QueueEmpty(Q))//把括号中的元素存入栈
      {DeQueue(Q,e2);
       Push(S,key);
       Push(S,e2);
      }
      if(f!=0){Push(S,key);}//最后还要存一个key
     }
    }
    cout<<"解释后的语言为:"<<endl;
    while(!StackEmpty(S))//处理后的元素依次出栈
    {Pop(S,e);
     EnQueue(Q,e);//为了输出对应汉字,元素进队
     if(e=='B'){cout<<B;}
     else if(e=='A'){cout<<A;}
     else{cout<<e;}
    }
    cout<<endl;
    while(!QueueEmpty(Q))//输出对应汉字
    {DeQueue(Q,e);
     switch(e)
     {case 't': cout<<"天";break;
      case 'd': cout<<"地"; break;
      case 's': cout<<"上"; break;
      case 'a': cout<<"一只"; break;
      case 'e': cout<<"鹅"; break;
      case 'z': cout<<"追"; break;
      case 'g': cout<<"赶"; break;
      case 'x': cout<<"下"; break;
      case 'n': cout<<"蛋"; break;
      case 'h': cout<<"恨"; break;
      case 'B': cout<<"天上一只鹅地上一只鹅";break;
      case 'A': cout<<"上一只鹅";break;
      default : cout<<"*";break;
     }
    }
    cout<<endl;
   }
   getchar();
  }
 }while(i>0&&i<2);
 cout<<endl<<"此程序制作者: 黄子皇 "<<endl;
 getchar();
 exit(0);
 return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -