用栈和队列实现魔王语言

本文介绍了一个使用栈和队列解析魔王特殊语言的系统。基本要求包括处理固定规则,将大写字母转换成小写字母的组合;扩展要求支持动态规则和汉字对应翻译。解题思路涉及逆序入栈、出栈入队并根据规则转换,以及提供一系列辅助函数进行规则管理。源代码包含在mowang.c中,规则存储在Rule文件,最终语言解释保存在endlanguage文件。
摘要由CSDN通过智能技术生成

问题描述:

魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听懂,但他的语言是可以逐步解释成人能听懂的语言的,因为它的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1) α→β1β2 ••• βn
(2)(θδ1δ2 •••δn)→θδnθδn-1 ••• θδ1θ
在这两种形式中,从左到右均表示解释。试写一个魔王语言的解释系统,把它的话解释成人能听懂的话。

(1)基本要求:

规则条数、规则内容固定(设定小写字母为终结符,大写字母为非终结符)

例如: (1) B→tAdA (2) A→sae
B(ehnxgz)B=tsaedsaeezegexenehetsaedsae

(2)扩展要求:

1)规则条数、内容不固定;
2)将终结符与汉字建立对应关系进行翻译

例如:

t d s a e z g x n h
一只

则魔王说的话是:“天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅”。

解题思路

先将魔王语言逆序入栈,入栈同时处理大写字母,这时候要一次性处理到无法再处理,然后出栈入队列,并且在入队列的同时按规则转换形式。

最后将队列里的英文翻译为对应汉字即可,有对应的译文则翻译,否则直接输出。

所用函数

void pushstack(char s[], char origin[], int *top);//入栈

void intoquene(char s[], int *top,char quene[]);//入队

void begin_translate();//开始翻译

void translate(char s[]);//翻译为最终语言

void see_rule();//列出当前规则

void see_language();//列出当前最终语言的解释

int find_rule(char ch,char s[20]);//查找规则是否已存在

int find_end_rule(char s1[20],char s2[20]);//找到最终规则

int find_endlanguage(char ch,char s[20]);//查找最终语言有无解释

void print_help();//打印帮助信息

int clear_rule();//清空规则

int add_rule();//添加规则

int delete_rule();//删除规则

int update_rule();//修改规则

void rule_UI();//管理规则界面

void Main_UI();//主界面

文件

源代码:
mowang.c

存储目前规则的文件
Rule

存取最终语言的文件
endlanguage

源代码

/*************************************************************************
    > File Name: mowang.c
    > Author:limeng 
    > Mail: ldx19980108@gmail.com
    > Created Time: 2017年10月21日 星期六 21时52分31秒
 ************************************************************************/

#include<stdio.h>
#include<string.h>
#include<stdlib.h> //exit
#define MAX 256

//思路:
//先将魔王语言逆序入栈,入栈同时处理大写字母,然后出栈入队列,并且在入队列的同时按规则转换形式。
//最后将队列里的英文翻译为对应汉字即可。

void pushstack(char s[], char origin[], int *top);//入栈
void intoquene(char s[], int *top,char quene[]);//入队
void begin_translate();//开始翻译
void translate(char s[]);//翻译为最终语言
void see_rule();//列出当前规则
void see_language();//列出当前最终语言的解释
int  find_rule(char ch,char s[20]);//查找规则是否已存在
int  find_endlanguage(char ch,char s[20]);//查找最终语言有无解释
void print_help();//打印帮助信息
int clear_rule();//清空规则
int add_rule();//添加规则
int delete_rule();//删除规则
int update_rule();//修改规则
void rule_UI();//管理规则界面
void Main_UI();//主界面

typedef struct Rule{
    char ch;//大写字母
    char s[20];//小写字母组成序列
}rule;

//查找规则是否已存在
int  find_rule(char ch,char s[20]){
    FILE *fp;
    fp = fopen("Rule","r");
    if(!fp){
        //printf("open file fail\n");
        return 0;
    }
    rule tmp;
    int flag = 0;
    while(fscanf(fp,"%c %s\n",&tmp.ch,tmp.s)>0)
    {
        if(ch == tmp.ch){
            strcpy(s,tmp.s);
            flag = 1;
            break;    
        }
    }
    fclose(fp);
    if(flag){
        return 1;
    }else
        return 0;

}


void find_end_rule(char s1[20],char s2[20]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值