回 帖 发 新 帖 刷新版面

主题:[原创]解--魔王语言

##########################################################
问题描述:
魔王总是使用自己的一种非常精练而抽象的语言讲话,没人能听懂,但他
的语言是可逐步解释成人能听懂的语言,因为他的语言是由以下两种形式
的规则由人的语言逐步抽象上去的:
-----------------------------------------------------------
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  |
---------------------------------------------------
| 天 | 地 | 上 | 一只| 鹅 | 追 | 赶 | 下 | 蛋 | 恨 |
---------------------------------------------------
#############################################################
实现提示:
将魔王的语言自右至左进栈,总是处理栈顶字符.若是开括号,则逐一出栈,将
字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈.
其它情形较简单.
应首先实现栈和队列的基本操作.
#############################################################
选作内容:
1)由于问题的特殊性,可实现栈和队列的顺序存储空间共享
2)代换变量的数目不限,则在程序开始运行时首先读入一组第一种形式的规则,
而不是把规则固定在程序中(第二种形式的规则只能固定在程序中). 



回复列表 (共1个回复)

沙发

解:
[code]
#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);

}
[/code]

PS:在上面的map字串数组中,本来是用汉字的,无奈显示不好,只好改成拼音了.^_^

我来回复

您尚未登录,请登录后再回复。点此登录或注册