栈和队列--魔王语言

可以算是一道经典的数据结构的问题吧。关于题目的描述这里就不讲了,反正大家都搜得到的。
我的笨脑子经过了自己一个晚上加上一个下午的思索,才终于把这道破题目给做出来了。
哎。。。智商是硬伤啊。。。
做了模块化处理,敲了一边队列和 栈的操作,一起贴出来算了
用的是顺序栈和链队
先把关键部分的代码贴出来。。。不然估计没人会看下面的东西。。。

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;
}


问题描述:魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听懂,但他的语言是可逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:-----------------------------------------------------------1)a---> (B1)(B2)....(Bm)2)[(op1)(p2)...(pn)]---->[o(pn)][o(p(n-1))].....[o(p1)o]-----------------------------------------------------------在这两种形式中,从左到右均表示解释.试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话.###########################################################基本要求:用下述两条具体规则上述规则形式(2)实现.设大写字母表示魔王语言的词汇; 小写字母表示人的语言的词汇;希腊字母表示可以用大写字母或小写字母代换的变量.魔王语言可含人的词汇.1) B --> tAdA2) A --> sae############################################################测试数据:B(ehnxgz)B 解释成 tsaedsaeezegexenehetsaedsae若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:"天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅".---------------------------------------------------| t | d | s | a | e | z | g | x | n | h |---------------------------------------------------| 天 | 地 | 上 | 一只| 鹅 | 追 | 赶 | 下 | 蛋 | 恨 |---------------------------------------------------#############################################################实现提示:将魔王语言自右至左进,总是处理顶字符.若是开括号,则逐一出,将字母顺序入队列,直至闭括号出,并按规则要求逐一出队列处理后入.其它情形较简单.应首先实现队列的基本操作.#############################################################选作内容:1)由于问题的特殊性,可实现队列的顺序存储空间共享2)代换变量的数目不限,则在程序开始运行时首先读入一组第一种形式的规则,而不是把规则固定在程序中(第二种形式的规则只能固定在程序中). 本程序在VC++上运行通过
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值