栈和队列--魔王语言

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

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


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值