LAB05队列的操作及应用

上传人:平*** 文档编号:11198733 上传时间:2017-10-12 格式:DOC 页数:20 大小:89.17KB
返回 下载 相关 举报
LAB05队列的操作及应用_第1页
第1页 / 共20页
LAB05队列的操作及应用_第2页
第2页 / 共20页
LAB05队列的操作及应用_第3页
第3页 / 共20页
LAB05队列的操作及应用_第4页
第4页 / 共20页
LAB05队列的操作及应用_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《LAB05队列的操作及应用》由会员分享,可在线阅读,更多相关《LAB05队列的操作及应用(20页珍藏版)》请在金锄头文库上搜索。

1、 算法与数据结构 实验报告- 1 -Lab05队列的操作及应用【实验目的和要求】1掌握队列的顺序表示和链表表示下的基本操作;2深入理解深度优先搜索和广度优先搜索的思想并能正确描述其算法;3会应用广度优先搜索算法解决较复杂的问题。【实验内容】1编写一个 C 源程序,其中包含顺序表示的空队列的创建、判断队列是否为空、进队、出队、取队列头部元素等操作。2编写一个 C 源程序,其中包含链表表示的空队列的创建、判断队列是否为空、进队、出队、取队列头部元素等操作。3. 简述深度优先搜索和广度优先搜索的思想,并给出具体的算法步骤。4应用广度优先搜索算法求解农夫过河问题。【实验仪器与软件】1CPU 主频在 1

2、GHz 以上,内存在 512Mb 以上的 PC;2VC6.0,Word 2003 及以上版本。实验讲评:实验成绩: 评阅教师:2012 年 月 日 算法与数据结构 实验报告- 2 -Lab05队列的操作及应用一、顺序表示的队列基本操作1顺序表示的队列操作基本源程序#include #include typedef int DataType;#define MAXNUM 100/*队列中最大元素个数*/struct SeqQueue/*顺序队列类型定义*/int f,r;DataType*q;/*为了算法设计上的方便:f 指出实际队头元素所在的位置,r指出实际队尾元素所在位置的下一个位置。*/t

3、ypedef struct SeqQueue*PSeqQueue;/*顺序队列类型的指针类型*/创建空队列PSeqQueue createEmptyQueue_seq(int m) PSeqQueue paqu;paqu= (PSeqQueue)malloc(sizeof(struct SeqQueue);if (paqu!=NULL) paqu-f = NULL;paqu-r = NULL; 算法与数据结构 实验报告- 3 -else printf(Out of space! n);return paqu;判断队列是否为空int isEmptyQueue_seq( PSeqQueue paq

4、u )return (paqu-f = NULL);进队运算void enQueue_seq( PSeqQueue paqu, DataType x ) /* 在队尾插入元素 x */if( (paqu-r + 1) % MAXNUM = paqu-f )printf( Full queue.n );else paqu-qpaqu-r = x;paqu-r = (paqu-r + 1) % MAXNUM;出队运算void deQueue_seq( PSeqQueue paqu ) /* 删除队列头部元素*/if( paqu-f = paqu-r )printf( Empty Queue.n )

5、;else paqu-f = (paqu-f + 1) % MAXNUM; 算法与数据结构 实验报告- 4 -取队列头部元素运算DataType frontQueue_seq( PSeqQueue paqu ) if( paqu-f = paqu-r )printf( Empty Queue.n );else return (paqu-qpaqu-f);int main() /主函数PSeqQueue pp;int n,m;printf(n please input the values(#include 算法与数据结构 实验报告- 5 -typedef int DataType;struct

6、Node;typedef struct Node*PNode;struct Node/*结点结构*/DataType info;PNode link;struct LinkQueue/*链接队列类型定义*/PNode f;/*头指针*/PNode r;/*尾指针*/;typedef struct LinkQueue *PLinkQueue;/*链接队列类型的指针类型*/创建链接表示的空队列PLinkQueue createEmptyQueue_link( int m ) PLinkQueue plqu;plqu= (PLinkQueue)malloc(sizeof(struct LinkQue

7、ue);if (plqu!=NULL) plqu-f = NULL;plqu-r = NULL;else printf(Out of space! n); 算法与数据结构 实验报告- 6 -return plqu;判断队列是否为空int isEmptyQueue_link( PLinkQueue plqu ) return (plqu-f = NULL);进队运算void enQueue_link( PLinkQueue plqu, Datatype x) PNode p;p = (PNode )malloc( sizeof( struct Node ) ); /*申请新结点空间*/if (

8、p = NULL )printf(Out of space!); /*申请新结点失败*/else p-info = x;p-link = NULL; /*填写新结点信息*/if (plqu-f = NULL) plqu-f = p; /*插入前是空队列*/else plqu-r-link = p; /*将新结点插入*/plqu-r = p; /*修改队尾指针*/ 算法与数据结构 实验报告- 7 -出队运算void deQueue_link( PLinkQueueplqu) PNodep;if( plqu-f = NULL ) printf( Empty queue.n );/*队列已空*/el

9、se p = plqu-f;plqu-f = p -link; /*修改队头指针*/free(p); /*释放已经删除结点空间*/取队列头部元素运算Datatype frontQueue_link( PLinkQueue plqu ) if( plqu-f = NULL ) printf( Empty queue.n );/*队列已空*/else return (plqu-f-info);int main() /主函数PLinkQueue pp;int n,m; 算法与数据结构 实验报告- 8 -printf(n please input the values(foot; 队列为空表明再无结点

10、可扩展五、农夫过河问题求解1农夫过河问题一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸。他要把这些东西全部运到北岸。2问题需求分析他面前只有一条小船,船小到只能容下他和一件物品,另外只有农夫能撑船。另外,因为狼能吃羊,而羊爱吃白菜,所以农夫不能留下羊和白菜或者狼和羊单独在河的一边,自己离开。请问农夫该采取什么方案才能将所有的东西运过河呢?3抽象数据类型设计求解这个问题的最简单的方法是一步一步进行试探,每一步都搜索所有可能的选择,对前一步合适的选择再考虑下一步的各种方案。用计算机实现上述求解的搜索过程可以采用两种不同的策略:一种是广度优先(breadth_first) 搜索,另一种是深度优先

11、(depth_first) 。广度优先:广度优先的含义就是在搜索过程中总是首先搜索下面一步的所有可能状态,然后再进一步考虑更后面的各种情况。要实现广度优先搜索,一般都采用队列作为辅助结构。把下一步所有可能达到的状态都列举出来,放在这个队列中,然后顺序取出来分别进行处理,处理过程中把再下一步的状态放在队列里。由于队列的操作遵循先进先出的原则,在这个处理过程中,只有在前一步的所有情况都处理完后,才能开始后面一步各情况的处理。4算法与数据结构的设计(1)安全状态的判断函数int safe(int location)/ 若状态安全则返回trueif (goat(location) = cabbage(

12、location) & (goat(location) != farmer(location)return (0);/ 羊吃白菜if (goat(location) = wolf(location) & (goat(location) != farmer(location)return (0);/ 狼吃羊return (1); / 其他状态是安全的 算法与数据结构 实验报告- 11 -(2)个体状态判断函数int farmer(int location)/判断农夫的位置return (0 != (location &0x08);int wolf(int location)/判断狼的位置retu

13、rn (0 != (location &0x04);int cabbage(int location)/判断白菜的位置return (0 != (location &0x02);int goat(int location)/判断羊的位置return (0 != (location &0x01);5算法的精化与程序的实现精化:要模拟农夫过河问题,首先需要选择一个对问题中每个角色的位置进行描述的方法。一个很方便的办法是用四位二进制数顺序分别表示农夫、狼、白菜和羊的位置。例如用 0表示农夫或者某东西在河的南岸,1 表示在河的北岸。因此整数 5(其二进制表示为 0101) 表示农夫和白菜在河的南岸,而

14、狼和羊在北岸。实现:完成了上面的准备工作,现在的问题变成:从初始状态二进制0000(全部在河的南岸) 出发,寻找一种全部由安全状态构成的状态序列,它以二进制 1111(全部到达河的北岸) 为最终目标,并且在序列中的每一个状态都可以从前一状态通过农夫(可以带一样东西)划船过河的动作到达。为避免不必要的瞎费功夫,要求在序列中不应该出现重复的状态。为了实现广度优先搜索,算法中需要使用了一个整数队列 moveTo,它的每个元素表示一个可以安全到达的中间状态。另外还需要一个数据结构记录已被访问过的各个状态,以及已被发现的能够到达当前这个状态的路径。由于在这个问题的解决过程中需要列举的所有状态(二进制 0000 1111)一共 16种,所以可以构造一个包含 16个元素的整数顺序表来满足以上的要求。用顺序表的第 i个元素记录状态 i是否已被访问过,若已被访问过则在这个顺序表元素中记入前驱状态值,算法中把这个顺序表叫做 route。route 的每个分量初始化值均为-1,每当我们在队列中加入一

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号