魔王语言解释器C语言,[数据结构]魔王语言解释c语言实现
[基本要求]
用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。魔王语言可含人的词汇。
(1)B -> tAdA
(2)A -> sae
[测试数据]
B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae
【实现】将需要解释的魔王语言当成一个字符数组,入栈1。再依次出栈,入栈2,依次处理顶端字符,若是开括号逐一出栈入队列,直至闭括号出栈。再逐一出队列,按照规则2解释,再重新入栈2。出栈2,按照规则1解释。
#include
#include
#include
#include
typedef struct Node //节点
{
char data;
struct Node *next;
}Node,*NodePtr;
typedef struct Stak //栈链表
{
NodePtr top;
NodePtr bot;
int count;
}Stak;
//初始化栈
void InitStak(Stak *ts)
{
ts->top = (NodePtr)malloc(sizeof(Node));
if (NULL == ts->top)
{
printf("分配失败");
exit(-1);
}
ts->bot = ts->top;
ts->count = 0;
ts->top->next = NULL;
}
//入栈
void Push(Stak *S, char e)
{
NodePtr pnew = (NodePtr)malloc(sizeof(Node));
pnew->data = e;
pnew->next = S->top;
S->top = pnew;
S->count++;
}
//出栈
char Pop(Stak *S)
{
NodePtr p;
if (S->bot == S->top)
{//空时返回1 删除失败
exit(1);
}
p = S->top;
char e = p->data;
S->top = S->top->next;
free(p);
S->count--;
return e;
}
//打印栈
void prin(Stak *S)
{
NodePtr p;
p = S->top;
while (p != S->bot)
{
printf("%c\n",p->data);
p = p->next;
}
}
bool EmptyStack(Stak *S)
//判断是否空栈
{
if (S->count == 0)
return 1;
return 0;
}
typedef struct QNode //队列节点
{
char data;
struct QNode *next;
}QNode,*QNodePtr;
typedef struct LinkQueue //队列链表
{
QNodePtr front, rear;
}Queue;
//队列初始化
void InitQue(Queue *Q)
{
QNodePtr p = (QNodePtr)malloc(sizeof(QNode)); //p为头节点
p->data = NULL;
p->next = NULL;
Q->front = p;
Q->rear = p;
}
//入队列
void EnQue(Queue *Q, char e)
{
QNodePtr p = (QNodePtr)malloc(sizeof(QNode));
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
}
char DeQue(Queue *Q)
//出队列
{
QNodePtr p;
char c;
if (Q->front == Q->rear)
{//空时
exit(1);
}
p = Q->front->next;
c = Q->front->next->data;
Q->front->next = p->next;
if (p == Q->rear)
{
Q->rear = Q->front;
}
free(p);
return c;
}
void pri(Queue *Q)
//打印队列
{
QNodePtr p;
p = Q->front;
if (p != NULL)
{
while (p != Q->rear)
{
printf("%c", p->next->data);
p = p->next;
}
}
}
bool EmptyQue(Queue *Q)
{
if (Q->front == Q->rear)
return 1;
return 0;
}
void Reverse(char M[], Stak *S)
{
int i;
int len = strlen(M);
int l = 0, r = 0;
for (i =0; i
{
Push(S, M[i]);
if (M[i] == '(')
l++;
if (M[i] == ')')
r++;
}
if (l != r)
exit(1);
}
void EnA(Queue *Q)
//规则1
{
EnQue(Q, 's');
EnQue(Q, 'a');
EnQue(Q, 'e');
}
void EnB(Queue *Q)
//规则1
{
EnQue(Q, 't');
EnA(Q);
EnQue(Q, 'd');
EnA(Q);
}
void Fpri(Queue *Q)
{
char c;
while (!EmptyQue(Q))
{
c = DeQue(Q);
switch (c)
{
case 't':printf("天"); break;
case 'd':printf("地"); break;
case 's':printf("上"); break;
case 'a':printf("一只"); break;
case 'e':printf("鹅"); break;
case 'z':printf("追"); break;
case 'g':printf("赶"); break;
case 'x':printf("下"); break;
case 'n':printf("蛋"); break;
case 'h':printf("恨"); break;
default: printf("Error");
}
}
}
void Tran(Stak *Sbe,Stak *Saf,Queue *Q )
{
char c;
char d;
int i=0;
while (Sbe->count != 0)
{
c = Pop(Sbe);
if (c == ')')
i = Saf->count;
else if (c == '(')
{
int j = Saf->count;
while ( j > i )
{
d = Pop(Saf);
EnQue(Q, d);
j--;
}
char e = Q->front->next->data;
DeQue(Q);
while (!EmptyQue(Q))
//规则2
{
char dl = DeQue(Q);
Push(Saf, e);
Push(Saf, dl);
}
Push(Saf, e);
}
else
Push(Saf, c);
}
while (Saf->count>0)
{
char en;
en = Pop(Saf);
if (en == 'A')
EnA(Q);
else if (en == 'B')
EnB(Q);
else
EnQue(Q,en);
}
Fpri(Q);
}
int main()
{
Stak Sf,St;
InitStak(&Sf);
InitStak(&St);
Queue Qu1;
InitQue(&Qu1);
char M[] = "B(ehnxgz)B";
Reverse(M, &Sf);
Tran(&Sf, &St, &Qu1);
getchar();
return 0;
}
魔王语言解释器C语言,[数据结构]魔王语言解释c语言实现相关推荐
- c语言的上级步骤,数据结构 上级程序一(C语言).doc
数据结构 上级程序一(C语言) 程序一:顺序表的运算 #define MAX 100 #include "stdio.h" int n; int insert(int b[],in ...
- c语言系统的通用数据结构,(转载)C语言实现通用数据结构的高效设计
(转载)C语言实现通用数据结构的高效设计 [复制链接] 使用宏替代模板的方案 最近在阅读一个开源的C++代码,里面用到了大量的STL里面的东西.也许是自己一直用C而很少用C++来实现算法的原因,STL ...
- c语言单链表功能,[数据结构]单链表(C语言)的各种功能
06-03阅读200,000 + 链表是一种常见的基本数据结构,在此充分利用了结构指针. 链表可以动态存储和分配,即链表是一个功能非常强大的数组. 他可以在节点中定义多种数据类型,并可以根据需要随意添 ...
- 数据结构与算法python语言实现答案_数据结构与算法:Python语言实现 源代码 PPT 练习答案 源码.zip...
1 60660-数据结构与算法:Python语言实现[练习答案]Solutions Manual.rar 943.25 KB 2018/11/1 12:03:34 2 __MACOSX 0 Bytes ...
- 数据结构中单链表的存储c语言,单链表一 - 数据结构与算法教程 - C语言网
1. 单链表概念&设计 单链表是一种链式存取的数据结构,,链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指 ...
- 冒泡法排序c语言算法步骤,冒泡排序 - 数据结构与算法教程 - C语言网
1.复杂度与稳定性 算法时间复杂度 最坏情况:O(n^2) 最好情况:O(n) 平均情况:O(n^2) 空间复杂度:S(n)=O(1) 稳定性:稳定排序 2.过程介绍(以顺序为例) 1.从第一个元素开 ...
- 数据结构 -- 魔王语言解释
这是数据结构的实验~~ 这是实现一个魔王语言解释器. 这里是采用栈,队列,线性表的综合实现的. 这个程序没上交,所以是中文注释的. 其实这个程序本身实用性不强,但是是个很不错的题目. Experime ...
- 数据结构魔王语言问题
出处:http://blog.csdn.net/hackbuteer1/article/details/6588574 [问题描述] 有一个魔王总是使用自己的一种非常精练而又抽象的语言讲话,没有人能 ...
- 数据结构与算法(C语言版)---魔王语言
1.需求分析 1.1.问题阐述 有一个魔王总是用自己一种非常精练而抽象的语言讲话,没有人能听懂,但他的语言可以逐步的转换成人的语言,他的语言由以下两种转换规则由人的语言逐步抽象上去的: (1)α-&g ...
- 自制计算机语言,3个步骤实现简单语言解释器(自制简易编程语言)
前段时间,我用 javascript 重新编写了一个 16 位的虚拟机,用它实现了一个定制的 CPU 架构和汇编语言,汇编器和调试器.虽然从头编一个语言可以完全实现自己的自定义目标,但过程却及其复杂. ...
最新文章
- pandas.DataFrame.iterrows
- Oracle开发常用知识
- java 根据类名示例化类_Java类类getProtectionDomain()方法及示例
- 【服务器】挖矿病毒 kdevtmpfsi(一针见效)
- php 微信实时更新,微信小程序修改data使页面数据实时更新的代码示例
- 人不能活在舒适区里,我要趁年轻出去闯闯
- 动手拆解众筹明星产品安全智能锁KeyWe后,发现它不安全且无解
- 我用Anylogic写了一个遗传算法
- excel公式里用html,Excel公式中{}是什么意思?要如何用?
- SOFA原理学习--sofa rpc入门示例
- iOS SDK开发二三事
- Java如何实现浅克隆与深克隆_Java浅谈克隆clone
- WiFi通信字节乱码问题的产生原因及解决方法
- html图片显示详情,纯CSS鼠标经过图片视差弹出层显示详情链接按钮特效代码.html...
- Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 't.statis_date'
- python求球的表面积_python-Hypar的表面积(双曲线抛物面)
- [jzoj5791]【NOIP2008模拟】阶乘 (数学)
- Java解析Google Maps API返回的Json
- 为了提前预测比赛结果,于是我用Python获取比赛球员数据进行分析,结果...
- Mar. 6, 15:00-17:00, 1493, Strichartz analysis for Schrodinger and wave equation I by Chong Chen