| 关键词: nbsp Stack StackNode iter break 语言 case 魔王 上一 data |
##########################################################问题描述:魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听懂,但他的语言是可逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:-----------------------------------------------------------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 |---------------------------------------------------| 天 | 地 | 上 | 一只| 鹅 | 追 | 赶 | 下 | 蛋 | 恨 |---------------------------------------------------############################################################# 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 StackNodestacknodemalloc( T data ){ StackNode p = (StackNode)malloc(sizeof(struct _StackNode)); assert(p); p->data = data; return p;}/*栈空吗?*/inline boolstackempty( Stack stack ){ return (stack->size)?false:true;}/*建一个栈,并初始化*/Stackstackcreat(void){ Stack p = (Stack)malloc(sizeof(struct _Stack)); assert(p); p->size=0; p->bottom=p->top=NULL; return p;}/*压栈*/boolstackpush( 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*/Tstackpop( 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;}/*销毁栈*/voidstackdestory( 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;}intmain(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);}///////////////////////////////////////// |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|