##########################################################
问题描述:
魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听懂,但他
的语言是可逐步解释成人能听懂的语言,因为他的语言是由以下两种形式
的规则由人的语言逐步抽象上去的:
-----------------------------------------------------------
1)a---> (B1)(B2)....(Bm)
2)[(op1)(p2)...(pn)]---->[o(pn)][o(p(n-1))].....[o(p1)o]
-----------------------------------------------------------
在这两种形式中,从左到右均表示解释.试写一个魔王语言的解释系统,把
他的话解释成人能听得懂的话.
###########################################################
基本要求:
用下述两条具体规则和上述规则形式(2)实现.
设大写字母表示魔王语言的词汇;
小写字母表示人的语言的词汇;
希腊字母表示可以用大写字母或小写字母代换的变量.
魔王语言可含人的词汇.
1) B --> tAdA
2) A --> sae
############################################################
测试数据:
B(ehnxgz)B 解释成 tsaedsaeezegexenehetsaedsae
若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:
"天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅".
---------------------------------------------------
| t | d | s | a | e | z | g | x | n | h |
---------------------------------------------------
| 天 | 地 | 上 | 一只| 鹅 | 追 | 赶 | 下 | 蛋 | 恨 |
---------------------------------------------------
#############################################################
CODE: [Copy to clipboard]
//////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
typedef char T;
/*
************** Stack **********
*/
typedef struct _StackNode{
T data;
struct _StackNode *next;
struct _StackNode *pri;
}*StackNode;
typedef struct _Stack{
int size;
StackNode bottom;
StackNode top;
}*Stack;
/*
*
*/
/*
分配栈结点,并赋值data
*/
inline StackNode
stacknodemalloc( T data )
{
StackNode p = (StackNode)malloc(sizeof(struct _StackNode));
assert(p);
p->data = data;
return p;
}
/*
栈空吗?
*/
inline bool
stackempty( Stack stack )
{
return (stack->size)?false:true;
}
/*
建一个栈,并初始化
*/
Stack
stackcreat(void)
{
Stack p = (Stack)malloc(sizeof(struct _Stack));
assert(p);
p->size=0;
p->bottom=p->top=NULL;
return p;
}
/*
压栈
*/
bool
stackpush( Stack stack,T data )
{
StackNode node = stacknodemalloc( data );
if( stackempty(stack) ){
stack->bottom=stack->top=node;
node->pri=NULL;
}else{
node->pri=stack->top;
stack->top->next=node;
stack->top=node;
}
++stack->size;
return true;
}
/*
出栈并返回data
*/
T
stackpop( Stack stack )
{
StackNode p=stack->top->pri;
T t = stack->top->data;
assert( ! stackempty(stack) );
free( stack->top );
if( --stack->size == 0 ){
stack->bottom=stack->top = NULL;
}else{
stack->top = p;
}
return t;
}
/*
销毁栈
*/
void
stackdestory( Stack stack )
{
while( !stackempty( stack ) ){
stackpop( stack );
}
free( stack );
}
/*
* ********************************************
*/
char *map[]={
"tian ","di ","shan ","yi zhi ","er ","zhui ","gan ","xia ","dan
","hen "
};
char *
charmap(char c)
{
char *p;
switch(c){
case 't':
p=map[0];
break;
case 'd':
p=map[1];
break;
case 's':
p=map[2];
break;
case 'a':
p=map[3];
break;
case 'e':
p=map[4];
break;
case 'z':
p=map[5];
break;
case 'g':
p=map[6];
break;
case 'x':
p=map[7];
break;
case 'n':
p=map[8];
break;
case 'h':
p=map[9];
break;
default:
p=NULL;
break;
};
return p;
}
int
main(void)
{
char input[256],*i_iter=input;
char output[256],*o_iter=output,*p=o_iter;
scanf("%s",input);
while(*i_iter){
if(*i_iter == 'B'){
strcpy(o_iter,"tsaedsae");
o_iter=&p[strlen(p)];
++i_iter;
}else{
if(*i_iter>='a'&&*i_iter<='z'){
char h=*i_iter++;
Stack stack=stackcreat();
for(;*i_iter>='a'&&*i_iter<='z';++i_iter){
stackpush(stack,*i_iter);
}
while(!stackempty(stack)){
*o_iter++=h;
*o_iter++=stackpop(stack);
}
stackdestory(stack);
}else{
++i_iter;
}
}
}
*o_iter='\0';
while(*p){
fprintf(stdout,"%s",charmap(*p++));
}
putchar('\n');
exit(0);
}
/////////////////////////////////////////