云南大学数据结构实验3

合集下载

数据结构3-串及其应用.

数据结构3-串及其应用.

实验3:串及其应用一、实验目的掌握串类型的实现方法和文本模式匹配方法,熟悉一般文字处理软件的设计方法。

二、问题描述全屏幕文本编辑器通过终端对文本文件进行创建、插入、删除、修改、存储等操作。

用户可完成对文本的插入、删除、修改等功能。

三、实验要求1、对光标实现如下操作:上、下、左、右移动一个字符位置;向前、后翻页;光标移至文件首、尾;光标移至本行首、尾。

2、实现基本编辑命令:I----在当前光标前插入内容,按ESC结束F----在当前光标后插入内容,按ESC结束D----删除光标所在行ND---删除光标位置开始的n行N-----删除光标上的字符W----将修改后的文本保存下来Q----退出编辑状态。

四、实验环境PC微机DOS操作系统或Windows 操作系统Turbo C 程序集成环境或Visual C++ 程序集成环境五、实验步骤1、在内存开辟可容纳80行大小的编辑工作区和buffer 的修改缓冲区。

2、要求用户输入编辑文件名,对读入的文件建立相应的页表和行表,在文本编辑程序中设立页指针、行指针、字符指针,分别指示当前操作的页、行、字符。

3、执行插入、删除、修改操作时,将本次操作内容放到缓冲区;4、操作确定后,将修改后的文本存到文件中。

六、测试数据自行设定。

七、实验报告要求实验报告应包括以下几个部分:1、问题描述;2、算法的设计描述;3、测试结果的分析与讨论。

4、设计与实现过程中的体会,进一步的改进设想。

5、实验总结。

八、思考题1、对命令格式非法等错误做严格检查和适当处理。

2、扩充编辑操作,如对某行进行串替换?。

实验3:使用SQL语句创建并管理数据库

实验3:使用SQL语句创建并管理数据库

序号:云南大学软件学院实验报告课程:数据库原理与实用技术实验学期:2015-2016学年第二学期任课教师:张云春专业:信息安全学号:20141120206 姓名:严鑫成绩:实验3使用SQL语句创建并管理数据库做删除或修改操作时,请注意备份数据库一、CAP数据库1、用T-SQL语句创建并管理数据库CAP:记录创建数据库的SQL语句。

CREATE DATABASE capon(name='cap',filename='d:\cap.mdf',size=5mb,maxsize=30mb,filegrowth=10%)log on(name='caplog',filename='d:\cap.ldf',size=5mb,maxsize=25mb,filegrowth=1mb)2、修改数据库:将“CAP数据库”的数据库最大容量更改为无限制(UNLIMITED),然后将“CAP数据库”的日志文件增长方式改为2MB。

记录SQL语句。

alter database capmodify file(name=cap,filename='d:\cap.mdf',maxsize=unlimited)alter database capmodify file(name=caplog,filename='d:\cap.ldf',filegrowth=2)3、用T-SQL语句在“CAP数据库”创建数据表,数据表的结构见教材。

记录创建表的SQL语句。

create table customers(cid char(10)not null,cname char(10)not null,city char(10)not null,discnt char(10)null,primary key(cid))create table agents(aid char(10)not null,aname char(10)not null,city char(10)not null,[percent]char(10)null,primary key(aid))create table products(pid char(10)not null, pname char(10)not null, city char(10)not null, quantity char(10)not null, price char(10)not null, primary key(pid))create table orders(ordno char(10)not null, [month]char(10)not null, cid char(10)not null,aid char(10)not null,pid char(10)not null,qty char(10)not null, dollars char(10)not null, primary key(ordno))4、向表中添加记录,使用Insert Into 语句分别向四张表中添加教材上的数据记录。

数据结构实验报告模板-09版 -v2

数据结构实验报告模板-09版 -v2

云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □学期:2012秋季学期任课教师: 秦江龙实验题目: 线性表及其应用小组长:联系电话:电子邮件:完成提交时间:年月日云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。

)云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。

)云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。

)(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。

难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)基本思路:先写控制台程序,保证算法的正确性后,再将程序封装成界面程序;程序设计:用c++中文件的操作对要进行加密的明文来使之变为乱码,要求用户记住,文件加密密钥,只有记住密钥,然后通过志浩解密器才能转化为明文,从而起到加密的效果;编程知识:用到对文件的操作,对文件的打开,读写,关闭,删除,插入等操作。

对话框的打开以及对话框中的操作。

二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)1、文件加密器包括加密以及解密:包括对文件的打开,密钥的输入,验证操作,对文件中字符的转化加密,;1、单击事件有四个:a.浏览…是为了用户能够打开要加密的文件,省去用户输入地址的麻烦,方便用户使用,使界面更加和谐,软件更加人性化;b.重置,是为了用户在输入密码时如果输入错误,可以点击清空后重置;c.加密文件,是用户在填完上面的信息之后可以开始加密就点击,点击完成后将会在相应的目录下生成加密文件,用户可以在原位置找到相应的加密文件;d.解密文件,是对已经用志浩加密器加密过的文件才能操作,在用户确认密钥后方可点击该按钮,点击完成当解密完成后将弹出提示,再到该目录下查找就可以看到加密的密文变为明文;三、【实现描述(Implement)】(30%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。

云大软件工程实验三 软件设计

云大软件工程实验三 软件设计

云大软件工程实验三软件设计云大软件工程实验三软件设计1.引言1.1 目的1.2 背景1.3 定义、缩略词和首字母缩略词的解释2.需求分析2.1 功能需求2.1.1 功能12.1.2 功能22.1.32.2 非功能需求2.2.1 性能需求2.2.2 可靠性需求2.2.3 安全性需求2.2.43.概要设计3.1 架构设计3.1.1 客户端-服务器架构3.1.2 分层架构3.1.33.2 模块划分3.2.1 模块13.2.2 模块23.2.33.3 接口设计3.3.1 外部接口3.3.2 内部接口3.3.33.4 数据库设计3.4.1 数据库结构3.4.2 数据库表设计3.4.34.详细设计4.1 模块1设计4.1.1 子模块1.1设计 4.1.2 子模块1.2设计 4.1.34.2 模块2设计4.2.1 子模块2.1设计 4.2.2 子模块2.2设计4.2.35.测试计划5.1 功能测试5.1.1 功能1测试用例 5.1.2 功能2测试用例 5.1.35.2 性能测试5.2.1 性能指标5.2.2 性能测试用例5.2.35.3 安全性测试5.3.1 安全漏洞测试用例5.3.2 安全性能测试用例5.3.36.上线计划6.1 部署步骤6.1.1 部署环境准备6.1.2 代码6.1.36.2 回滚计划6.3 验收标准附件:附件一:需求说明书附件二:设计图纸附件三:测试用例法律名词及注释:1.版权:对作品(例如文学、音乐、软件等)所赋予的法律上的保护,使其著作权人能够授权他人使用或复制作品。

2.专利:对发明的新技术、产品或方法的法律保护,使其专利持有人拥有独占使用或制造的权利。

3.商标:能够识别品牌或企业的标志、名称、符号或设计的法律保护,使其商标持有人能够独占使用。

4.涉密信息:指涉及国家安全、经济安全、社会公共利益和个人隐私安全等方面的机密信息。

数据结构实验报告实验总结

数据结构实验报告实验总结

数据结构实验报告实验总结本次数据结构实验主要涉及线性表、栈和队列的基本操作以及链表的应用。

通过实验,我对这些数据结构的特点、操作和应用有了更深入的了解。

下面对每一部分实验进行总结。

实验一:线性表的基本操作线性表是一种常见的数据结构,本实验要求实现线性表的基本操作,包括插入、删除、查找、遍历等。

在实验过程中,我对线性表的结构和实现方式有了更清晰的认识,掌握了用数组和链表两种方式实现线性表的方法。

实验二:栈的应用栈是一种后进先出(LIFO)的数据结构,本实验要求利用栈实现简单的括号匹配和后缀表达式计算。

通过实验,我了解到栈可以方便地实现对于括号的匹配和后缀表达式的计算,有效地解决了对应的问题。

实验三:队列的应用队列是一种先进先出(FIFO)的数据结构,本实验要求利用队列实现银行排队和迷宫求解。

通过实验,我对队列的应用有了更加深入的了解,了解到队列可以解决需要按顺序处理的问题,如排队和迷宫求解等。

实验四:链表的应用链表是一种常用的数据结构,本实验要求利用链表实现学生信息管理系统。

通过实验,我对链表的应用有了更深入的了解,了解到链表可以方便地实现对于数据的插入、删除和修改等操作,并且可以动态地调整链表的长度,适应不同的需求。

通过本次实验,我掌握了线性表、栈、队列和链表的基本操作,并了解了它们的特点和应用方式。

同时,通过实际编程的过程,我对于数据结构的实现方式和效果有了更直观的认识,也锻炼了自己的编程能力和解决问题的能力。

在实验过程中,我遇到了一些问题,如程序逻辑错误和内存泄漏等,但通过调试和修改,最终成功解决了这些问题,对自己的能力也有了更多的信心。

通过本次实验,我深刻体会到了理论与实践的结合的重要性,也对于数据结构这门课程有了更加深入的理解。

总之,本次数据结构实验给予了我很多有益的启发和收获,对于数据结构的概念、特点和应用有了更深入的理解。

在以后的学习中,我会继续加强对数据结构的学习和研究,不断提高自己的编程能力和解决问题的能力。

数据结构实验三实验报告

数据结构实验三实验报告

数据结构实验三实验报告数据结构实验三实验报告一、实验目的本次实验的目的是通过实践掌握树的基本操作和应用。

具体来说,我们需要实现一个树的数据结构,并对其进行插入、删除、查找等操作,同时还需要实现树的遍历算法,包括先序、中序和后序遍历。

二、实验原理树是一种非线性的数据结构,由结点和边组成。

树的每个结点都可以有多个子结点,但是每个结点只有一个父结点,除了根结点外。

树的基本操作包括插入、删除和查找。

在本次实验中,我们采用二叉树作为实现树的数据结构。

二叉树是一种特殊的树,每个结点最多只有两个子结点。

根据二叉树的特点,我们可以使用递归的方式实现树的插入、删除和查找操作。

三、实验过程1. 实现树的数据结构首先,我们需要定义树的结点类,包括结点值、左子结点和右子结点。

然后,我们可以定义树的类,包括根结点和相应的操作方法,如插入、删除和查找。

2. 实现插入操作插入操作是将一个新的结点添加到树中的过程。

我们可以通过递归的方式实现插入操作。

具体来说,如果要插入的值小于当前结点的值,则将其插入到左子树中;如果要插入的值大于当前结点的值,则将其插入到右子树中。

如果当前结点为空,则将新的结点作为当前结点。

3. 实现删除操作删除操作是将指定的结点从树中移除的过程。

我们同样可以通过递归的方式实现删除操作。

具体来说,如果要删除的值小于当前结点的值,则在左子树中继续查找;如果要删除的值大于当前结点的值,则在右子树中继续查找。

如果要删除的值等于当前结点的值,则有三种情况:- 当前结点没有子结点:直接将当前结点置为空。

- 当前结点只有一个子结点:将当前结点的子结点替代当前结点。

- 当前结点有两个子结点:找到当前结点右子树中的最小值,将其替代当前结点,并在右子树中删除该最小值。

4. 实现查找操作查找操作是在树中寻找指定值的过程。

同样可以通过递归的方式实现查找操作。

具体来说,如果要查找的值小于当前结点的值,则在左子树中继续查找;如果要查找的值大于当前结点的值,则在右子树中继续查找。

国家开放大学《数据结构》课程实验报告(实验3 ——栈、队列、递归设计)参考答案

国家开放大学《数据结构》课程实验报告(实验3 ——栈、队列、递归设计)参考答案
{
x=Pop(s); /*出栈*/
printf("%d ",x);
InQueue(sq,x); /*入队*/
}
printf("\n");
printf("(10)栈为%s,",(StackEmpty(s)?"空":"非空"));
printf("队列为%s\n",(QueueEmpty(sq)?"空":"非空"));
ElemType Pop(SeqStack *s); /*出栈*/
ElemType GetTop(SeqStack *s); /*取栈顶元素*/
void DispStack(SeqStack *s); /*依次输出从栈顶到栈底的元素*/
void DispBottom(SeqStack *s); /*输出栈底元素*/
} SeqQueue; /*定义顺序队列*/
void InitStack(SeqStack *s); /*初始化栈*/
int StackEmpty(SeqStack *s); /*判栈空*/
int StackFull(SeqStack *s); /*判栈满*/
void Push(SeqStack *s,ElemType x); /*进栈*/
sq=(SeqQueue *)malloc(sizeof(SeqQueue));
InitQueue(sq);
printf("(8)队列为%s\n",(QueueEmpty(sq)?"空":"非空"));
printf("(9)出栈/入队的元素依次为:");

云南大学软件学院报告

云南大学软件学院报告

课程:数据结构实验学期:2014-2015学年第一学期任课教师:专业:信息安全学号:姓名:成绩:实验5 图基础实验一、实验目的1.掌握图的存储结构及其遍历。

二、实验软硬件环境(CPU、OS、IDE):三、实验任务(要求写出核心代码,并对运行结果截图)1)使用邻接矩阵和邻接表储表示分别实现如下给定的图1、图2、图3所示图的物理存储结构。

2)在1)所建立的图形存储结构上分别实现深度优先搜索遍历和广度优先搜索遍历,并给出遍历结果(序列)。

图3 有向图实验代码:#include<stdio.h>#include<stdlib.h>#define MAXVEX 20#define OK 1#define ERROR 0#define OVERFLOW -1#define INFINITY 65535#define QueueSize 20 //队列中最大元素个数typedef int QElemType; //队列的元素的类型typedef int VertexType;typedef int EdgeType;typedef enum{False,True}Boolean; //Boolean是布尔类型,其值是ture或false Boolean visited[MAXVEX]; //访问标志的数组。

typedef struct{VertexType vexs[MAXVEX];EdgeType arc[MAXVEX][MAXVEX];int numVertexes,numEdges;} MGraph; //邻接矩阵。

typedef struct EdgeNode //边表结点。

{int adjvex;struct EdgeNode *next;}EdgeNode;typedef struct VertexNode //顶点表结点。

{int data;EdgeNode *firstedge;}VertexNode,AdjList[MAXVEX];typedef struct{AdjList adjlist;int numVertexes,numEdges; //图中当前顶点数边数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验难度: A □ B C □学期:2017秋季学期任课教师: 储星实验题目: 栈和队列及其应用组员及组长:承担工作:联系电话:电子邮件:完成提交时间: 2018 年 11 月 18 日一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计等相关知识,对问题进行概要性地分析)魔王语言的解释规则:B →tAdA;A→ sae;(ehnxgz) → ezegexenehe 则魔王语言B(ehnxgz)B解释成tsaedsaeezegexenehetsaedsae大写字母表示魔王语言的词汇,小写字母表示人的词汇语言,魔王语言中可以包含括号,魔王语言的产生式规则在程序中给定,当接收用户输入的合法的魔王语言时,通过调用魔王语言翻译函数来实现翻译。

在 A 的基础上,(根据产生式)自定义规则,将一段魔王的话翻译为有意义的人类语言(中文):字母-汉字对应表:"t d s a e z g x n h""天地上一个鹅追赶下蛋恨"运用了离散数学的一些基本知识及程序设计知识。

二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等)为实现上述程序功能,应以栈和队列来表示。

1.设定栈的抽象数据类型定义为:typedef struct stack{char *base; // 顺序栈的栈底指针char *top; // 顺序栈的栈顶int stacksize; // 栈元素空间的大小}stack; // 结构体类型顺序栈基本操作:ListInitiate (&S) 构造一个空栈S。

StackEmpty(S)栈S已经存在。

若栈S为空栈,则返回TRUE,否则返回FALSE。

Push(&S,e)栈S已经存在。

在栈S的栈顶插入新的栈顶元素e。

Pop(&S,&e)栈S已经存在。

删除S的栈顶元素,并以e返回其值。

2. 设定队列的抽象数据类型定义为:typedef struct QNode{char data;struct QNode *next;}*LinkQueueNode;typedef struct{LinkQueueNode front;LinkQueueNode rear;}LinkQueue;/*结构体队列类型*/基本操作:ListInitiate (&Q) 构造一个空队列Q。

StackEmpty(Q)队列Q已经存在。

若队列Q为空,则返回TRUE,否则返回FALSE。

EnQueue(&Q,e)队列Q已经存在。

插入元素e为Q的新的队尾元素。

DeQueue(&Q,&e)队列Q已经存在。

删除Q的队头元素,并以e返回其值。

2.程序包含四个模块:1)主程序模块:Void main(){初始化;For(){接受处理命令;}接受处理;}2)栈模块——实现栈的抽象数据类型;3)队列模块——实现队列的抽象数据类型。

4)魔王语言解释模块——定义线性表的结点结构。

各模块的之间的调用关系如下:主程序模块魔王语言解释模块栈模块队列模块三、【实现(Implement)】(30%)(本部分应包括:抽象数据类型各操作的具体实现代码、关键操作的具体算法实现、函数实现,主程序实现等,并给出关键算法的时间复杂度分析。

如有界面则需包括界面的关键实现方法等。

)栈的基本操作:int Initstack(stack &s)// 初始化空栈{s.base = (char*)malloc(100 * sizeof(char));if (!s.base)exit(0);s.top = s.base;s.stacksize = 100;return 1;}int StackEmpty(stack s)// 判断栈是否为空{if (s.top == s.base)return 1;return 0;}void push(stack &s, char e)// 入栈{if (s.top - s.base >= s.stacksize){s.base = (char*)realloc(s.base, (s.stacksize + 10) * sizeof(char));if (!s.base)exit(0);s.top = s.base + s.stacksize;s.stacksize += 10;}*s.top++ = e;}int pop(stack &s, char &e)// 出栈{if (s.top == s.base)exit(0);e = *--s.top;return 1;}队列的基本操作:int InitQueue(LinkQueue &Q)// 初始化空队列{Q.front = Q.rear = (LinkQueueNode)malloc(sizeof(LinkQueueNode));if (!Q.front)exit(-1);Q.front->next = NULL;return 1;}int QueueEmpty(LinkQueue Q)// 判断队列是否为空{if (Q.front == Q.rear)return 1;return 0;}int EnQueue(LinkQueue &q, char e)// 入队列{LinkQueueNode p;p = (LinkQueueNode)malloc(sizeof(QNode));if (!p)exit(-1);p->data = e;p->next = NULL;q.rear->next = p;q.rear = p;return 1;}char DeQueue(LinkQueue &q, char &e)// 删除队列队头元素并返回其值{LinkQueueNode p;if (q.front == q.rear)return 0;p = q.front->next;e = p->data;q.front->next = p->next;if (q.rear == p)q.rear = q.front;free(p);return e;}魔王语言解释的具体实现:void checke(char e)// 翻译列表根据弹栈字母转化为汉字并打印void transmite(stack s)// 翻译模块{LinkQueue q;InitQueue(q);char c, e;printf("魔王是说:");while (!StackEmpty(s))// 若栈不为空则开始翻译{pop(s, e);checke(e);if (e == '(')// 括号处理{while (pop(s, e) && e != ')')// 括号匹配EnQueue(q, e);push(s, e);DeQueue(q, c);while (!QueueEmpty(q)){DeQueue(q, e);push(s, c);push(s, e);}push(s, c);while (!StackEmpty(s)){pop(s, e);if (e == ')')break;else checke(e);}}}printf("\n");}四、【测试结果(Testing)】(10%)(本部分应包括:对实验的测试结果,应具体列出每次测试所输入的数据以及输出的数据,并对测试结果进行分析,可附截图)五、【实验总结】(10%)(本部分应包括:自己在实验中完成的任务,及存在的问题,所完成实验过程中的具体经验总结、心得)问题关键:1. 栈的初始化,入栈出栈操作,栈为空的判断条件,队列的初始化,入队和出队操作,队列为空的判断。

以及队列中最后一个元素被删除后尾指针的修改。

2. 一些细节处理,比如数组操作等。

3.将魔王语言作为一个字符串读入进来,首先检查括号是否匹配,如果不匹配就无法解释。

如果匹配,然后将字符串从尾到头依次压入栈 S中,将栈 S中的内容依次弹出压入栈 S2中,直至遇到右括号,将其压入栈 S1中,并将栈 S2弹出依次压入栈 S1中,直至遇到左括号压入栈 S1中,这样栈 S1中存放的内容就是匹配的第一个内重括号,将栈 S1 栈顶元素左括号弹出,将左括号下面的那个元素保存在 e1 变量中,然后将其他元素弹出依次压入栈 S3中,在将 e1与栈 S3中依次弹出的元素压入栈S2 中,重复这个过程,直至将魔王语言中所有的括号都处理完为止,所以这个思路可以处理多重括号嵌套的问题。

六、思考题或【项目运作描述(Operate)】(10%)(注:选择C难度的才需要填写“项目运作描述”,其他难度的只需完成思考题)(项目运作描述应包括:项目的成本效益分析,应用效果等的分析。

)1. 栈:特点就是一个先进后出的结构。

主要用途:函数调用和返回,数字转字符,表达式求值,走迷宫等等。

在 CPU内部栈主要是用来进行子程序调用和返回,中断时数据保存和返回。

在编程语言中:主要用来进行函数的调用和返回。

可以说在计算机中,只要数据的保存满足先进后出的原理,都优先考虑使用栈,所以栈是计算机中不可缺的机制。

队列:特点就是一个先进先出的结构。

只要满足数据的先进先出原理就可以使用队列。

2. 可以采用顺序存储结构和链式存储结构,因为他们都是线性表,就像一排站在一条线上的人,位置关系是一个挨一个的,这样的顺序不会改变,而改变点都在头或者尾,仍然保持形态不变的。

七、【代码】(10%)(本部分应包括:完整的代码及充分的注释。

注意纸质的实验报告无需包括此部分。

格式统一为,字体: Georgia , 行距: 固定行距12,字号: 小五)#include<iostream>#include<stdlib.h>using namespace std;typedef struct stack{char *base; // 顺序栈的栈底指针char *top; // 顺序栈的栈顶int stacksize; // 栈元素空间的大小}stack; // 结构体类型顺序栈typedef struct QNode{char data;struct QNode *next;}*LinkQueueNode;typedef struct{LinkQueueNode front;LinkQueueNode rear;}LinkQueue;/*结构体队列类型*/int Initstack(stack &s)// 初始化空栈{s.base = (char*)malloc(100 * sizeof(char));if (!s.base)exit(0);s.top = s.base;s.stacksize = 100;return 1;}int StackEmpty(stack s)// 判断栈是否为空{if (s.top == s.base)return 1;return 0;}void push(stack &s, char e)// 入栈{if (s.top - s.base >= s.stacksize){s.base = (char*)realloc(s.base, (s.stacksize + 10) * sizeof(char));if (!s.base)exit(0);s.top = s.base + s.stacksize;s.stacksize += 10;}*s.top++ = e;}int pop(stack &s, char &e)// 出栈{if (s.top == s.base)exit(0);e = *--s.top;return 1;}int InitQueue(LinkQueue &Q)// 初始化空队列{Q.front = Q.rear = (LinkQueueNode)malloc(sizeof(LinkQueueNode));if (!Q.front)exit(-1);Q.front->next = NULL;return 1;}int QueueEmpty(LinkQueue Q)// 判断队列是否为空{if (Q.front == Q.rear)return 1;return 0;}int EnQueue(LinkQueue &q, char e)// 入队列{LinkQueueNode p;p = (LinkQueueNode)malloc(sizeof(QNode));if (!p)exit(-1);p->data = e;p->next = NULL;q.rear->next = p;q.rear = p;return 1;}char DeQueue(LinkQueue &q, char &e)// 删除队列队头元素并返回其值{LinkQueueNode p;if (q.front == q.rear)return 0;p = q.front->next;e = p->data;q.front->next = p->next;if (q.rear == p)q.rear = q.front;free(p);return e;}void checke(char e)// 翻译列表{if (e == 'B')printf("天上一只鹅地上一只鹅");else if (e == 'A')printf("上一只鹅");else if (e == 't')printf("天");else if (e == 'd')printf("地");else if (e == 's')printf("上");else if (e == 'a')printf("一只");else if (e == 'e')printf("鹅");else if (e == 'z')printf("追");else if (e == 'g')printf("赶");else if (e == 'x')printf("下");else if (e == 'n')printf("蛋");else if (e == 'h')printf("恨");else if (e != '(' && e != ')')printf("%c", e);}void transmite(stack s)// 翻译模块{LinkQueue q;InitQueue(q);char c, e;printf("魔王是说:");while (!StackEmpty(s))// 若栈不为空则开始翻译{pop(s, e);checke(e);if (e == '(')// 括号处理{while (pop(s, e) && e != ')')// 括号匹配EnQueue(q, e);push(s, e);DeQueue(q, c);while (!QueueEmpty(q)){DeQueue(q, e);push(s, c);push(s, e);}push(s, c);while (!StackEmpty(s)){pop(s, e);if (e == ')')break;else checke(e);}}}printf("\n");}void main(){stack s;Initstack(s);char a[100];cout <<"规则:"<< endl;cout <<"α->β1β2...βn"<< endl;cout <<"(θδ1δ2...δn)->θδnθδn-1...θδ1θ"<< endl;cout <<""<< endl;cout <<"字母-汉字对应表:"<< endl;cout <<"t d s a e z g x n h"<< endl;cout <<"天地上一个鹅追赶下蛋恨"<< endl;cout <<""<< endl;cout <<"魔王说:";int i = 0;cin >> a;while (a[i])i++;for (int k = i; k >= 0; k--)push(s, a[k]);transmite(s);system("pause");}。

相关文档
最新文档