文章目录

  • 问题描述及需求分析
    • 需求分析
  • 问题分析及实现路线(队列+栈)
    • 结构体核心代码
      • 队列核心代码
        • 入队
        • 出队
      • 栈的核心代码
        • 入栈
        • 出栈
  • 全部代码
  • 单向循环队列和栈(改变B的对应密码)
  • 总结

问题描述及需求分析

有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听懂。但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1) α→β1…βm
(2) (θδ1…δn) →θδnθδn-1…θδ1θ 在这两种形式中,从左到右均表示解释;从右到左均表示抽象。试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
测试数据:
用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言解释的词汇,小写字母表示人的语言的词汇;希腊字母表示可以用大写或小写字母代换的变量。魔王语言可含人的词汇。
(1).Β→ tΑdΑ
(2).Α→ sae
测试数据:
B(einxgz)B
解释成 tsaedsaeezegexeneietsaedsae 若将小写字母与汉字建立下表所示的对应关系,则魔王说的话是:“天上一个鹅地上一个鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一个鹅地上一个鹅。”
t d s a e z g x n i
天 地 上 一个 鹅 追 赶 下 蛋 恨

需求分析

1.创建一个队列和栈。
2.要求输入一串魔王语言。
3.解码方式:B->tAdA, A->sae
4.根据魔王语言与对应汉字关系进行输出打印


问题分析及实现路线(队列+栈)

提示:将魔王的语言自右至左进栈,总是处理栈顶。若是开括号,则逐一出栈,将字母顺序入队列,直至闭括号出栈,并按规则要求逐一出队列再处理后入栈。其他情形较简单,请读者思考应如何处理。应首先实现栈和队列的基本运算。

结构体核心代码

//定义队列和栈的结点
typedef struct node{char data;struct node *next;
}LinkNode;
//定义栈的栈顶指针
typedef struct {LinkNode *top;
}LinkStack;
//定义队列的队头和队尾
typedef struct{LinkNode * rear,*front;
}LinkQueue;

队列核心代码

入队

//入队
void InQueue(LinkQueue *queue,char x){LinkNode *p = (LinkNode*) malloc(sizeof (LinkNode*));p->data = x;p->next = NULL;if(queue->front ==NULL){queue->front = queue->rear = p;}else {queue->rear->next = p;queue->rear = p;}
}

出队

//出栈
char pop(LinkStack *stack ){if(stack->top==NULL){return 0;}
//    出栈LinkNode *p = stack->top;stack->top = p->next;char temp = p->data;        //保存出栈的值free(p);return temp;
}

栈的核心代码

入栈

//入栈(链栈)
void push(LinkStack *stack,char x){LinkNode *p = (LinkNode *)malloc(sizeof (LinkNode));p->data = x;p->next = stack->top;stack->top = p;
}
//入队

出栈

//出栈
char pop(LinkStack *stack ){if(stack->top==NULL){return 0;}
//    出栈LinkNode *p = stack->top;stack->top = p->next;char temp = p->data;        //保存出栈的值free(p);return temp;
}

全部代码

代码如下(示例):

c
#include <stdio.h>
#include <string.h>
#include <malloc.h>//定义队列和栈的结点
typedef struct node{char data;struct node *next;
}LinkNode;
//定义栈的栈顶指针
typedef struct {LinkNode *top;
}LinkStack;
//定义队列的队头和队尾
typedef struct{LinkNode * rear,*front;
}LinkQueue;
//初始化队列
void InitQueue(LinkQueue *queue) {queue->front = queue->rear = NULL;
}
//初始化栈
void InitStack(LinkStack *stack){stack->top = NULL;
}
//入栈
void push(LinkStack *stack,char x){LinkNode *p = (LinkNode *)malloc(sizeof (LinkNode));p->data = x;p->next = stack->top;stack->top = p;
}
//入队
void InQueue(LinkQueue *queue,char x){LinkNode *p = (LinkNode*) malloc(sizeof (LinkNode*));p->data = x;p->next = NULL;if(queue->front ==NULL){queue->front = queue->rear = p;}else {queue->rear->next = p;queue->rear = p;}
}
//出栈
char pop(LinkStack *stack ){if(stack->top==NULL){return 0;}
//    出栈LinkNode *p = stack->top;stack->top = p->next;char temp = p->data;        //保存出栈的值free(p);return temp;
}
//出队列
char DeQueue(LinkQueue *queue){if(queue->front ==NULL){return 0;}LinkNode *p = queue->front;char temp = p->data;        //保存出队列的值queue->front = p->next;free(p);return temp;
}
//判断出栈结束位置
void deal(LinkQueue *queue,LinkStack *stack){char res = pop(stack);
//    当遇到闭括号时出栈结束while(res !=')') {InQueue(queue,res);res = pop(stack);}char first = DeQueue(queue);        //保留第一个希腊字母push(stack,first);while(queue->front!=NULL){res = DeQueue(queue);
//        压入原先字母和第一个希腊字母和push(stack,res);push(stack,first);}
}
//匹配文字,输出结果
void metch(char x){char password[11] = "tdsaezgxni";char chinese[10][8] = {"天","地","上","一个","鹅","追","赶","下","蛋","恨"};for(int i = 0;i< strlen(password);i++){if(x ==password[i]){printf("%s",chinese[i]);}}}
//把翻译出来的密码进行翻译,得到最终结果
void printresult(char x){char A_string[4] ="sae";if(x =='A'){for(int k = 0;k< strlen(A_string);k++){metch(A_string[k]);     //匹配字符}}else{metch(x);}
}
int main() {printf("解释魔王语言,请输入魔王语言!\n");char language[100];
//    获取输入gets(language);char B_string[5] ="tAdA";LinkStack ptr;InitStack(&ptr);        //初始化栈LinkQueue queue;InitQueue(&queue);      //          初始化队列int count =0;for(int i = strlen(language)-1;i>=0;i--){//        判断是否已经全部入栈if(language[i]=='\000') {break;}
//        从右往左,入栈到'('时开始,出栈,入队列else if(language[i] =='('){deal(&queue,&ptr);}else{//            先处理‘B'if(language[i] =='B'){for(int j = strlen(B_string)-1;j>=0;j--){//                    把B对应密码,倒序压入push(&ptr,B_string[j]);}}else{//                压栈push(&ptr,language[i]);}}count++;}char temp;while(ptr.top!=NULL){//        打印结果,测试数据B(einxgz)Btemp = pop(&ptr);printresult(temp);      //打印结果}return 0;
}

单向循环队列和栈(改变B的对应密码)

全部代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义栈的结点
#define Max 100
typedef struct{char *base;char *top;int size;
}seqStack;
//定义队列
typedef struct{char *data;int front;int rear;
}seqQueue;
//初始话栈
void initseqStack(seqStack *stack){stack->base = (char*)malloc(Max*sizeof (char));if(stack->base==NULL){exit(1);}stack->top = stack->base;stack->size = Max;
}
//初始化队列
void initseqQueue(seqQueue *queue){queue->data =(char*)malloc(Max*sizeof (char));if(queue->data==NULL){exit(1);}queue->front = queue->rear =0;}
//入队
void inQueue(seqQueue *queue,char x){if((queue->rear+1)%Max ==queue->front ){printf("队列已满");exit(1);}queue->data[queue->rear] =x;queue->rear = (queue->rear+1)%Max;}
//出队
char deQueue(seqQueue *queue){if((queue->rear+1)%Max ==queue->front){printf("????????");exit(1);}char temp = queue->data[queue->front];queue->front = ((queue->front+1)%Max);return temp;}
//入栈
void push(seqStack *stack,char x){if(stack->top - stack->base ==stack->size){stack->base = (char*) realloc(stack->base,(stack->size+Max)*sizeof (char));if(stack->base ==NULL){exit(1);}stack->top = stack->base+stack->size;stack->size +=Max;}*(stack->top++) =x;}
//出栈
char pop(seqStack *stack){if(stack->base ==stack->top){return 0;}char temp= *(--stack->top);return temp;
}
//进行处理
void deal(seqQueue *queue,seqStack *stack){char res = pop(stack);
//   保存栈第一个的字符while(res !=')') {inQueue(queue,res);res = pop(stack);}char first = deQueue(queue);        //保留队列的第一个元素push(stack,first);while(queue->front!=queue->rear){res = deQueue(queue);
//        把3元素压入栈,并且得压入那个添加得元素push(stack,res);push(stack,first);}
}
//匹配结果
void metch(char x){char password[11] = "tdsaezgxni";char chinese[10][8] = {"天","地","上","一个","鹅","追","赶","下","蛋","恨"};for(int i = 0;i< strlen(password);i++){if(x ==password[i]){printf("%s",chinese[i]);}}}
//打印结果
void printresult(char x){char A_string[4] ="sae";if(x =='A'){for(int k = 0;k< strlen(A_string);k++){metch(A_string[k]);     //匹配字符}}else{metch(x);}
}
int main() {printf("解释魔王语言,请输入魔王语言!!\n");char language[100];
//    获取输入gets(language);char B_string[100];printf("请输入'B'对应得字符");gets(B_string);seqStack stack;initseqStack(&stack);seqQueue queue;initseqQueue(&queue);int count =0;for(int i = strlen(language)-1;i>=0;i--) {//        判断是否已经全部入栈if (language[i] == '\000') {break;} else if (language[i] == '(') {deal(&queue, &stack);}
//        从右往左,入栈到'('时开始,出栈,入队列else {//            先处理‘B'if (language[i] == 'B') {for (int j = strlen(B_string) - 1; j >= 0; j--) {//                    把B对应密码,倒序压入if(B_string[j]!='\000') {push(&stack, B_string[j]);}}} else {//                压栈push(&stack, language[i]);}}}char temp;while(stack.top!=stack.base){//        打印结果,测试数据B(einxgz)Btemp = pop(&stack);printresult(temp);      //打印结果}return 0;
}

总结

这里对文章进行总结,把魔王语言进行两种解释方式,并采用不同的结构,代码很烂,可供参考,希望大佬指点小弟,在评论区指点迷津。

魔王语言问题c语言实现及思路求解相关推荐

  1. 魔王语言(C语言版)

    问题描述: 魔王的语言是由以下两种形式的规则由人的语言逐步抽象上去的. (1)α–>β(1)β(2)β(3)-.β(m) (2)(θδ(1)δ(2)δ(3)-δ(n))–>θδ(n)θδ( ...

  2. c语言填空题删除字符串k右边,计算机二级C语言上机模拟试题及解题思路

    计算机二级C语言上机模拟试题及解题思路 随着2017年上半年计算机等级考试的临近,百分网小编为大家整理了2017计算机二级C语言上机模拟试题及解题思路,更多计算机等级考试信息请关注应届毕业生考试网. ...

  3. c语言一些算法解题技巧,c语言常见小算法的解题思路.doc

    c语言常见小算法的解题思路 判定某一年是否是闰年 闰年时间:四年一闰,百年不闰,四百年再闰.,其中 大写字母转小写字母 大写字母+32 = 小写字母 A = 65 a = 97 输入一个华氏温度,要求 ...

  4. 易语言源码 VX多开 思路+源码

    介绍: 易语言源码 VX多开 思路+源码 网盘下载地址: http://kekewangLuo.cc/aOqsvkyTX0g 图片:

  5. C语言实现三子棋游戏 代码+思路+电脑下棋算法

    C语言实现三子棋游戏 代码+思路+电脑下棋算法 重点: 当检测到电脑已经两子连续时,将会尝试获得胜利. 在检测到玩家即将胜利(连城两子)时,进行拦截 尝试胜利的优先级高于拦截,意味着如果玩家不能再下一 ...

  6. 小型职工工作量c语言,计算机c语言职工工作量统计系统(20页)-原创力文档

    <C 语言课程设计>报告 题目:职工工作量统计系统 班 级: 学 号: 姓 名: 指导老师: 成 绩: 目 录 1 . 课 程 设 计 的 目 的 和 意 义 ·············· ...

  7. c语言是非结构化程序语言_一个资深C语言工程师说C语言的重要性!直言道:不学C学什么?...

    前言 C语言属于高级程序语言的一种,它的前身是"ALGOL".其创始人是布朗·W·卡尼汉和丹尼斯·M·利奇.C语言问世时是带有很大的局限性,因为它只能用于UNIX系统上.然而随着科 ...

  8. c语言 空格_C语言100题集合-ex003

    系列文章<C语言经典100例>持续创作中,欢迎大家的关注和支持. 喜欢的同学记得点赞收藏哦- 1 题目 函数:fun() 功能:统计一行字符串单词的个数,作为函数值返回 描述:一行字符串在 ...

  9. 一起学习C语言:C语言循环结构(一)

    上一章 <一起学习C语言:C语言基本语法> 系列内容中,我们了解了if语句.switch语句的使用方式以及不同运算符的优先级等内容.本章节,我们学习C语言循环结构用法. 章节预览: 1. ...

  10. C语言实现二叉树的各种遍历及求解深度

                                                                               C语言实现二叉树的各种遍历及求解深度 一.介绍   ...

最新文章

  1. java fseek_转到C中的二进制文件的某个点(使用fseek),然后从该位置读取(使用fread)...
  2. TSNE 正规英文api
  3. 盘点9 个实用的 JSON 工具
  4. mysql安装过程遇到的问题_个人在mysql安装过程中遇见的问题
  5. 2018华为网络技术大赛笔记
  6. CFA要学哪些课程?零基础怎么学CFA呢?
  7. 人类认识宇宙7次飞跃,中国贡献0《科学是什么》张双南研究员演讲全文(回复“科学是什么”下载PDF典藏版科普资料)
  8. 20个常用教育心理学效应
  9. 计算机信息工程专业工资,2020年工科类专业薪资最新排名,计算机很吃香,工资水平最高...
  10. ftp上传工具绿色版,五款ftp上传工具绿色版好用推荐
  11. JavaScript中变量判断是否是数字,判断是否是整数,判断是否是正整数/负整数,判断奇数/偶数的方法
  12. 基于PHP的招聘网站
  13. 方舟大洋洲服务器稳定嘛,方舟生存进化最新版182.0更新内容翻译一览
  14. lajp linux教程,linux IMX6 汇编点亮一个LED灯
  15. 一套完整的微信公众号代运营方案
  16. c 语言小学生心算测试,谁知道C语言程序设计:小学生心算器
  17. 微信小程序点击事件(bindtap)传递参数
  18. 反卷积 算法 c语言,多次曝光图像的PSF反卷积以及欠采样图像的反混叠技术I:PSFdeLRSA的制作方法...
  19. 如何通过监听器统计在线人数?
  20. IntelliJ IDEA导入主题包

热门文章

  1. 2021高考语文作文成绩查询,2021高考语文作文已出炉,撒贝宁押题太准了,你有想写的冲动吗...
  2. Linux-linux系统函数
  3. QCustomplot之安装篇(一)
  4. js判断一个数字是否是整数
  5. 程序员带新人的几点思考
  6. IT忍者神龟之Microsoft Office Enterprise 2007 简体版 企业版 序列号
  7. 软件“吃掉”创新 企业如何深陷罗网?
  8. hiho#1082 然而沼跃鱼早就看穿了一切
  9. C语言程序设计-算数运算符、赋值运算符、逗号运算符及表达式
  10. XGBoost中如何防止过拟合