📄 魔王语言.cpp
字号:
#include<iostream.h>
#include<string.h>
#include<stack>
#include<queue>
void transfer(char *a)
{
using std::stack;
stack <char>s1;
using std::queue;
queue <char>q1,q2;//q1用于存放整个字符串。q2用于存放()里的字符串。
int i=strlen(a);
int k=0;//用于标志是否是队列中的第一个元素。
char s,t;
for(int j=0;j<i;j++)
{q1.push(a[j]);}
cout<<"魔王的语言是:";
while(!q1.empty())
{
s=q1.front();
q1.pop();
if(s=='B')
cout<<"天上一只鹅地上一只鹅";
else if(s=='A')
cout<<"上一只鹅";
else if(s=='(')
{
while(s!=')')
{
s=q1.front();
q1.pop();
if(s!=')')//(和)都不放进队列中。
q2.push(s);
}
while(!q2.empty())//将q2里面的内容分情况的放进栈s1中。
{
if(k==0)//k初始值为0,用于标记是不是队列中的第一个元素。
{
t=q2.front();//获取()中的第一个元素
s1.push(q2.front());//用栈是因为()里的元素打印出来都是从后向前的输出。不同的是每一个元素输出前需要先输出()的第一个元素。
q2.pop();
k++;
}//在进栈时,除了队列的第一个直接进栈,后面的每一个进栈后都要再进入一个此队列最初的元素。
else
{
s1.push(q2.front());
q2.pop();
s1.push(t);
}
}
//将栈s1中的元素输出及为()的语言。
while(!s1.empty())
{
char r=s1.top();
s1.pop();
if(r=='A')
cout<<"上一只鹅";
else if(r=='B')
cout<<"天上一只鹅地上一只鹅";
else
{
switch(r)//不是B,A,()时的字母的输出。利用switch语句。
{
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;
}
}
}
}
else
{
switch(s)//不是B,A,()时的字母的输出。利用switch语句。
{
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;
}
}
}
cout<<endl;
}
void main()
{
char a[100000];//不可以定义为char * a;这样在后面cin>>a ;回引起错误,因为它是野指针。
cout<<"从这些字母中选择:t-天、d-地、s-上、a-一只、e-鹅、z-追、g-赶、x-下、n-蛋、h-恨、A-sae、B-tAdA、"<<endl;
cout<<"请输入魔王的语言:"<<endl;
cin>>a;
transfer(a);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -