数据结构实验二 栈和队列

一、实验目的

  1. 掌握栈和队列的基本操作
  2. 栈和队列的算法设计
  3. 栈和队列的应用
  4. 递归

二、实验内容

  1. 循环队列
  2. 进制转换
  3. 迷宫-深度策略
  4. 迷宫-广度策略
  5. 农夫过河-广度策略
  6. “聪明的学生”

三、实验环境

在PTA平台进行实验

四、实验要求

根据每个实训的要求完成代码提交和测评

五、实验步骤 

描述算法的原理或实现流程(测评完全正确或部分正确的实训)

6-1 循环队列入队出队 本题要求实现队列的顺序存储表示,包括入队、出队和取队头操作

入队:首先检查队列是否已满,如果不满,则在队尾插入元素,尾指针+1;满则返回ERROR

出队:判断是否为空,如果不为空,保存队头元素,头指针+1;为空则返回ERROR

取队头:判断是否为空,不为空则返回队头元素的值,头指针不变

6-2 进制转换(10->16)本题要求实现十进制到十六进制的转换,用户输入10进制的数,要求输出该数的16进制表示

十进制转化成十六进制可以利用“除十六取余,逆序排序”法:

利用算法,用十进制数除以16得到商和余数,把余数压入栈中,再将余数除以16,如此循环下去,直至商为0的时候,将此时的余数输出,再将栈中的其他余数输出,得到的就是16进制数。

7-1 迷宫-深度策略

一个陷入迷宫的老鼠如何找到出口的问题。老鼠希望系统性地尝试所有的路径之后走出迷宫。如果它到达一个死胡同,将原路返回到上一个位置,尝试新的路径。在每个位置上老鼠可以向八个方向运动,顺序是从正东开始按照顺时针进行。无论离出口多远,它总是按照这样的顺序尝试,当到达一个死胡同之后,老鼠将进行“回溯”。迷宫只有一个入口,一个出口,设计程序要求输出迷宫的一条通路。迷宫用二维存储结构表示,1表示障碍,0表示通路;采用回溯法设计求解通路的算法。要求如下:1、实现栈的相关操作;2、利用栈实现回溯算法输出路径;

设计栈来储存走过的路径,创建两个栈分别存放行坐标和列坐标,设置一个标记数,当走过此点后将次标记数标记为1,未走过标记为0.mov为周围八个节点为0的个数。如果mov不为0,按顺时针探索各个位置,是出口则输出路径并返回1。如果不是出口且为走过该路径,则将当前位置的标记数改为1,并将当前位置压入栈中,在将位置定位到下一个节点,并把mov值设为0。如果下一个节点不时出口同时也已经被标识为1,mov+1.

7-2 迷宫-广度策略

1.创建两个空队列LinkQueueX和LinkQueueX

2.将入口entreX和entryY分别压入队列LinkQueueX和LinkQueueX。

3.当队列不空

①取队头元素,出队

②for(mov=0;mov<8;mov++),即还存在可以探索的相邻的方向。

a.按照顺时针依次探索各个位置(X,Y)。

b.如果(posX,posY)是出口,则输出路径,返回。

c.如果(posX,posY)是没有走过的通路;

设置标志位mark[posX][posY]=1。当前位置入队。记录前驱位置,方便输出路径。

7-3 农夫过河-广度策略

一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸。他要把这些东西全部运到北岸。遗憾的是他只有一只小船,小船只能容下他和一件物品。这里只能是农夫来撑船。同时因为狼吃羊,而羊吃白菜,所以农夫不能留下羊和狼或者羊和白菜单独在河的一边,自己离开。好在狼属于肉食动物,不吃白菜。农夫怎样才能把所有的东西安全运过河呢?

为了表示每个物品的位置,采用二进制位来区分南岸和北岸,0表示在南岸,1表示在北岸。用四个二进制位XXXX分别表示农夫、狼、菜和羊四个物品所在的位置。例如1110表示农夫、狼和菜在北岸,菜在南岸。农夫过河问题的初始状态为0000,结束状态为1111。

先把羊送到对面,再把狼送到对面,然后在把羊送回去,再把白菜送去对岸,最后把羊送到对岸。或者:

先把羊送到对面,再把白菜送到对面,然后在把羊送回去,再把狼送去对岸,最后把羊送到对岸。

设定一个有四个元素的列表表示狼,羊,菜,商人的状态。

initial_state = [0, 0, 0, 0]

这个元素对应的状态为0时,代表这个元素在此岸,反之在彼岸。

我们需要做的就是讲这个状态由[0,0,0,0]变成[1,1,1,1]、也就是让所有的元素全部过河。

但是为了避免狼吃掉羊,羊吃掉菜。我们对可行的中间状态还要做一定的设置。然后用枚举法的方式列举出来。知道有一个方案能成功让[0,0,0,0]变成[1,1,1,1]为止。

7-4 "聪明的学生"

问题描述:一位逻辑学的教授有三个非常聪明善于推理且精于心算的学生,Alice、Bob和Charles。一天教授给他们出了一个题。教授在每个人脑门上帖了一个纸条,每个纸条上写了一个正整数,Alice、Bob和Charles分别是3,5,8,并且告诉学生某两个数的和等于第三个,每个学生只能看见另外两个同学头上的正整数,但是看不见自己的。

教授问的顺序是Alice---Bob—Charles—Alice……经过几次提问后,当教授再次询问到Charles时,Charles露出了得意的笑容,准确的报出了自己头上的数。

输入格式:本题输入为Alice、Bob和Charles头上的数字

输出格式:教授在第几次提问时,轮到回答问题的那个人猜出了自己头上的数(要求用递归程序解决)。

对于一个局面 (x, y, x+y),不妨设 x > y,那么 x+y 那个人能猜出自己脑袋上的数当且仅当他能排除自己脑袋上的数是 x-y 的可能性。怎么排除?就是假设自己脑袋上是 x-y,那么由于他知道另外两个人的数是啥(即 x 和 y),他也知道 x > y,那么就是说 (x, y, x-y) 中最大的是 x,那么如果在轮到头上是 x 的那个人在他理应猜出来的那步时还回答不出来,就说明自己头上的数不可能是 x-y,那么就可以从 (x, y, x-y) 这个局面的答案退出 (x, y, x+y) 这个局面的答案了。

六、问题记录实验总结(必写

通过这次实验复习了栈和队列的大部分知识,但是链栈和链队列的插入删除操作不是很熟练。

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值