可以算是一道经典的数据结构的问题吧。关于题目的描述这里就不讲了,反正大家都搜得到的。
我的笨脑子经过了自己一个晚上加上一个下午的思索,才终于把这道破题目给做出来了。
哎。。。智商是硬伤啊。。。
做了模块化处理,敲了一边队列和 栈的操作,一起贴出来算了
用的是顺序栈和链队
先把关键部分的代码贴出来。。。不然估计没人会看下面的东西。。。
Devil.cpp
#include "Quene.h" #include "SqStack.h" int Init(char *regular, char *language, int &length); int Operation(int length, char *language, char *regular, SElemType &e, SqStack &s, SqStack &temps, LinkQuene &Q); int PrintfLan(LinkQuene Q, SElemType e); int main() { //define int length = 0; SElemType e; SqStack s, temps; LinkQuene Q; char language[1024]; char regular[1024]; //Init memset(language, 0, 1024); memset(regular, 0, 1024); InitStack(s); InitStack(temps); InitQuene(Q); //functions Init(regular, language, length); Operation(length, language, regular, e, s, temps, Q); PrintfLan(Q, e); return 0; } int Init(char *regular, char *language, int &length) { //scanf devil's language printf("我是大魔王,我要开始说鸟语了\n"); printf("魔王的规则B-->"); gets(regular); printf("魔王的语言:"); gets(language); length = strlen(language); return 0; } int Operation(int length, char *language, char *regular, SElemType &e, SqStack &s, SqStack &temps, LinkQuene &Q) { char add; char *p; char *q; //stack in for (int j = length - 1; j >= 0; j--) Push(s, *(language + j)); //stack to quene while (StackEmpty(s)) { Pop(s, e); if (e != '(' && e != ')') //处理不是括号的情况 { //处理是B的情况 if (e == 'B') { //B中有A q = regular; while (*q) { if (*q =='A') { EnQuene(Q, 's'); EnQuene(Q, 'a'); EnQuene(Q, 'e'); } else EnQuene(Q, *q); q++; } } else if (e == 'A') //处理是A的情况 { EnQuene(Q, 's'); EnQuene(Q, 'a'); EnQuene(Q, 'e'); } else //处理一般情况 EnQuene(Q, e); } else //处理括号的情况 { //进临时栈 if (e == '(') //处理左括号 { Push(temps, e); Pop(s, e); add = e; Pop(s, e); while (e != ')') { Push(temps, e); Push(temps, add); Pop(s, e); } } if (e == ')') //处理右括号 Push(temps, e); //出栈 Pop(temps, e); while (e != '(') { Pop(temps, e); EnQuene(Q, e); } } } return 0; } int PrintfLan(LinkQuene Q, SElemType e) { //printf while (QueneEmpty(Q)) { DeQuene(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: break; } } return 0; }