数据结构实验指导手册(2015版)
数据结构实验指导书

《数据结构》实验指导书实验一顺序表实验目的:熟悉顺序表的逻辑特性、存储表示方法和顺序表的基本操作。
实验要求:了解并熟悉顺序表的逻辑特性、存储表示方法和顺序表的基本操作的实现和应用。
实验内容:1、编写程序实现在线性表中找出最大的和最小的数据元素,并符合下列要求:(1)设数据元素为整数,实现线性表的顺序存储表示。
(2)从键盘输入10个数据元素,利用顺序表的基本操作建立该表。
(3)利用顺序表的基本操作,找出表中最大的和最小的数据元素(用于比较的字段为整数)。
2、编写一个程序实现在学生成绩中找出最高分和最低分,并符合下列要求:(1)数据元素为学生成绩(含姓名、成绩等字段)。
(2)要求尽可能少地修改第一题的程序来得到此题的新程序,即要符合第一题的所有要求。
(这里用于比较的字段为分数)实验二链表实验目的:熟悉链表的逻辑特性、存储表示方法的特点和链式表的基本操作。
实验要求:了解并熟悉链式表的逻辑特性、存储表示方法和链式表的基本操作的实现和应用。
实验内容:1、编写一个程序建立存放学生成绩的有序链表并实现相关操作,要求如下:(1)设学生成绩表中的数据元素由学生姓名和学生成绩字段组成,实现这样的线性表的链式存储表示。
(2)键盘输入10个(或若干个,特殊数据来标记输入数据的结束)数据元素,利用链表的基本操作建立学生成绩单链表,要求该表为有序表并带有头结点。
(用于比较的字段为分数)。
(3)输入关键字值x,打印出表中所有关键字值<=x的结点。
(用于比较的关键字字段为分数)。
(4)输入关键字值x,删除表中所有关键字值<=x的结点。
(用于比较的关键字字段为分数)。
(5)输入关键字值x,并插入到表中,使所在的链表仍为有序表。
(用于比较的字段为分数)。
实验三栈的应用实验目的:熟悉栈的逻辑特性、存储表示方法和栈的基本操作。
实验要求:了解并熟悉栈的逻辑特性、顺序和链式存储表示方法和栈的基本操作的实现和应用。
实验内容:(1)判断一个表达式中的括号(仅有一种括号,小、中或大括号)是否配对。
数据结构实验-实验指导书

实验一线性表操作一、实验目的1熟悉并掌握线性表的逻辑结构、物理结构。
2熟悉并掌握顺序表的存储结构、基本操作和具体的函数定义。
3熟悉VC++程序的基本结构,掌握程序中的用户头文件、实现文件和主文件之间的相互关系及各自的作用。
4熟悉VC++操作环境的使用以及多文件的输入、编辑、调试和运行的全过程。
二、实验要求1实验之前认真准备,编写好源程序。
2实验中认真调试程序,对运行结果进行分析,注意程序的正确性和健壮性的验证。
3不断积累程序的调试方法。
三、实验内容基本题:1对元素类型为整型的顺序存储的线性表进行插入、删除和查找操作。
加强、提高题:2、编写一个求解Josephus问题的函数。
用整数序列1, 2, 3, ……, n表示顺序围坐在圆桌周围的人。
然后使用n = 9, s = 1, m = 5,以及n = 9, s = 1, m = 0,或者n = 9, s = 1, m = 10作为输入数据,检查你的程序的正确性和健壮性。
最后分析所完成算法的时间复杂度。
定义JosephusCircle类,其中含完成初始化、报数出圈成员函数、输出显示等方法。
(可以选做其中之一)加强题:(1)采用数组作为求解过程中使用的数据结构。
提高题:(2)采用循环链表作为求解过程中使用的数据结构。
运行时允许指定任意n、s、m数值,直至输入n = 0退出程序。
实验二栈、队列、递归应用一、实验目的1熟悉栈、队列这种特殊线性结构的特性2熟练掌握栈、队列在顺序存储结构和链表存储结构下的基本操作。
二、实验要求1实验之前认真准备,编写好源程序。
2实验中认真调试程序,对运行结果进行分析,注意程序的正确性和健壮性的验证。
3不断积累程序的调试方法。
三、实验内容基本题(必做):1分别就栈的顺序存储结构和链式存储结构实现栈的各种基本操作。
2、假设以带头结点的循环链表表示队列,并且只设一个指针指向对尾结点,不设头指针,试设计相应的置队空、入队和出队的程序。
加强题:3设线性表A中有n个字符,试设计程序判断字符串是否中心对称,例如xyzyx和xyzzyx都是中心对称的字符串。
2015数据结构实验手册资料

《数据结构实验》指导书Data Structures and Algorithms Laboratory Projects王金荣2014-09-11目录1《数据结构实验》课程实验教学大纲--------------------------------------12 实验准备: 如何使用VC 6.0? ----------------------------------------------33 Projects---------------------------------------------------------------------------8 3.1 Project 1: 算法性能测量-------------------------------------------------8 3.2 Project 2: 有序表归并实验---------------------------------------------10 3.3 Project 3: 数据转换------------------------------------------------------11 3.4 Project 4: 二叉树遍历实验---------------------------------------------12 3.5 Project 5-1: 堆排序算法实现------------------------------------------13 3.6 Project 5-2: 归并排序算法实现---------------------------------------14 3.7 Project 5-3: 快速排序算法实现---------------------------------------15 3.8 Project 6-1: 图的深度优先搜索---------------------------------------16 3.9 Project 6-2: 图的广度优先搜索---------------------------------------173.10 Project 7: 散列实验---------------------------------------------------184.1 ACM题目-------------------------------------------------------------------19 4.1 ACM 1: ACboy needs your help again!-------------------------------19 4.2 ACM 2: Jumping the Queue--------------------------------------------21 4.3 ACM 3: Median ----------------------------------------------------------234.4 ACM 4: Ignatius and the Princess I------------------------------------255 实验报告格式-----------------------------------------------------------------28 6实验报告上交说明-----------------------------------------------------------291《数据结构实验》课程实验教学大纲课程中文名称:数据结构实验课程英文名称:Data Structure Practices实验课程性质:独立设课课程编码:044209101一、学时、学分课程总学时:34 实验学时:34课程总学分:1 实验学分:1二、适用专业及年级计算机科学与技术专业,软件工程专业,第二学期三、实验教学目的与基本要求“数据结构实验”的总体目标是:通过实验使学生对课堂讲授的内容有实际的体验,加深对概念、算法、技术的理解、掌握、应用,并激发学生进一步的思考和发挥,注重培养学生的学习兴趣和创新思维。
数据结构实验指导书

数据结构实验指导书一、实验目的数据结构是计算机科学中的重要基础课程,通过实验,旨在帮助学生更好地理解和掌握数据结构的基本概念、原理和算法,提高学生的编程能力和问题解决能力。
具体而言,实验的目的包括:1、加深对常见数据结构(如数组、链表、栈、队列、树、图等)的理解,掌握其特点和操作方法。
2、培养学生运用数据结构解决实际问题的能力,提高算法设计和程序实现的能力。
3、增强学生的逻辑思维能力和调试程序的能力,培养学生的创新意识和团队合作精神。
二、实验环境1、操作系统:Windows 或 Linux 操作系统。
2、编程语言:C、C++、Java 等编程语言中的一种。
3、开发工具:如 Visual Studio、Eclipse、Code::Blocks 等集成开发环境(IDE)。
三、实验要求1、实验前,学生应认真预习实验内容,熟悉相关的数据结构和算法,编写好实验程序的代码框架。
2、实验过程中,学生应独立思考,认真调试程序,及时记录实验过程中出现的问题及解决方法。
3、实验完成后,学生应撰写实验报告,包括实验目的、实验内容、实验步骤、实验结果、问题分析与解决等。
四、实验内容(一)线性表1、顺序表的实现与操作实现顺序表的创建、插入、删除、查找等基本操作。
分析顺序表在不同操作下的时间复杂度。
2、链表的实现与操作实现单链表、双向链表的创建、插入、删除、查找等基本操作。
比较单链表和双向链表在操作上的优缺点。
(二)栈和队列1、栈的实现与应用实现顺序栈和链式栈。
利用栈解决表达式求值、括号匹配等问题。
2、队列的实现与应用实现顺序队列和链式队列。
利用队列解决排队问题、广度优先搜索等问题。
(三)树1、二叉树的实现与遍历实现二叉树的创建、插入、删除操作。
实现二叉树的前序、中序、后序遍历算法,并分析其时间复杂度。
2、二叉搜索树的实现与操作实现二叉搜索树的创建、插入、删除、查找操作。
分析二叉搜索树的性能。
(四)图1、图的存储结构实现邻接矩阵和邻接表两种图的存储结构。
数据结构 2015版(严)

树和二叉树
问题:对于一般的二叉树如何存储呢?
●非完全二叉树的存储示例
1 3 5 6 7
6 7Βιβλιοθήκη 2 4一般二叉树也 必须以完全二 叉树的形式来 确定。无结点 的补0,造成了 存储空间的浪 费。
bt(1:11)
1 2 3 4 5 0 0 0 0
(0表示不存在此结点)
6.2 二叉树
6.2.3 二叉树的存储结构 一、顺序存储结构
6.2 二叉树
6.2.1 二叉树的定义 ● 基本形态:二叉树有5种基本形态。
树和二叉树
A B
A
A B
左子树为空
A B C
左、右子树 均非空
空二叉树
只有根结点 的二叉树
右子树为空
图6.3 树的5种基本形态
6.2 二叉树
6.2.2 二叉树的性质
树和二叉树
性质1:在二叉树的第i层上至多有2i-1个结点(i≥1)。 [证]用归纳法。 1)i=1,只有一个根结点。2i-1=20=1。正确。 2)设命题对j成立,即有第j层上至多有2j-1个结 点。由于二叉树每个结点的度至多为2,故第i层上最 大结点数是第i-1层的2倍,即2j-1.2=2j=2(j+1)-1。故命 题对j+1亦成立。 证毕。
link n
困惑:构造树的结点时 应当开多少个链域?
树和二叉树
左孩子-右兄弟表示法
A B C D
E
F
G
H
I
J
data 右兄弟 左孩子
K
L
M
多叉树转为 了二叉树
6.2 二叉树
树和二叉树
为何要重点研究结点最多只有两个 “叉” 的树?
● 二叉树的结构最简单,规律性最强; ● 可以证明,所有树都能转为唯一对应的二叉树, 不失一般性。
数据结构课程实验指导书

《数据结构》实验指导书第一部分前言一、实验的目的《数据结构》是计算机学科一门重要的专业基础课程,也是计算机学科的一门核心课程。
本课程的另一重要教学目的是训练学生进行复杂程序设计的技能和培养良好程序设计的习惯,要做到这一点,上机实习是必须的。
数据结构实验是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。
通常,实验课题中的问题比平时的习题复杂得多,也更接近实际。
实验着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,训练学生实际动手进行程序设计和调试程序的能力,加深对数据结构相关概念和算法的理解。
通过完成本实验课程的实验,学生应学会并掌握本课程的基本和重点知识,深刻理解逻辑结构、物理结构和算法设计之间的关系,初步学会算法分析的方法,并能在一定范围内运用所掌握的分析方法进行算法分析,培养软件工作所需要的动手能力和作为一个软件工作者所应具备的科学工作方法和作风。
二、实验前的准备工作1.每个学生需配备一台计算机,操作系统需Windows2000/XP以上版本,软件需Visual C++6.0以上版本。
2.实验前要求学生按实验要求编写好相关实验程序,准备上机调试运行。
三、实验的步骤(一)建立一个文件夹,如“数据结构”,用来存放自己的所有实验程序,在该文件夹中建立子目录用来存放每个项目(一个子目录一个项目),如“顺序表”,项目中需要的所有文件都存在该文件夹中。
(二)新建一个项目文件1.双击Visual C++ 6.0快捷图标,进入Visual C++ 6.0集成开发环境;或者点击“开始”→“程序”→“Microsoft Visual Studio 6.0”→“Microsoft Visual C++ 6.0”进入Visual C++ 6.0集成开发环境。
2.单击“File”菜单,选择“New”命令3.创建一个项目文件并保存在项目所在文件夹中;3. 创建源程序文件并保存在项目所在文件夹中;4.输入源程序;5.单击“保存”按钮保存源程序。
数据结构2015版严.pdf

6.2 二叉树
6.2.1 二叉树的定义 ● 基本形态:二叉树有5种基本形态。
树和二叉树
A
A
A
A
空二叉树
只有根结点 的二叉树
B
右子树为空
B
B
C
左子树为空
左、右子树 均非空
图6.3 树的5种基本形态
6.2 二叉树
树和二叉树
6.2.2 二叉树的性质
性质1:在二叉树的第i层上至多有2i-1个结点(i≥1)。
树和二叉树
第6章 树和二叉树
计算机科学与技术学院 主讲:孙玉霞
树和二叉树
目 录
6.1 树的定义和基本术语 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林 6.6 赫夫曼树及其应用
树和二叉树
●基本要求: 1)理解并准确叙述树、二叉树、森林及其有关概念并
熟悉它们的基本性质; 2)熟悉树形结构的存储结构和中序线索二叉树; 3)熟悉树的遍历方法,尤其是二叉树的前序、中序和
困惑:构造树的结点时 应当开多少个链域?
左孩子-右兄弟表示法
树和二叉树
data 左孩子 右兄弟
A
B
C
D
E
F
G
HI
J
K
L
M
多叉树转为 了二叉树
6.2 二叉树
树和二叉树
为何要重点研究结点最多只有两个 “叉” 的树?
● 二叉树的结构最简单,规律性最强; ● 可以证明,所有树都能转为唯一对应的二叉树, 不失一般性。
树和二叉树
6.1 树的定义和基本术语
6.1.2 树的基本术语
• 结点(node)——表示树中的元素,包括数据项及若干指向其 子树的分支
数据结构实验指导书

数据结构实验指导书院别专业班级姓名计算机学院编实验一线性表的顺序存储实验一、实验目的及要求1、掌握在TC环境下调试顺序表的基本方法2、掌握顺序表的基本操作,插入、删除、查找、以及有序顺序表的合并等算法的实现。
二、实验学时2学时三、实验任务1、生成一个顺序表并动态地删除任意元素和在任意位置插入元素。
2、将两个有序表合并成一个有序表。
四、实验重点、难点1、在顺序表中移动元素。
2、在顺序表中找到正确的插入位置。
五、操作要点(一)顺序表基本操作的实现[问题描述] 当我们要在顺序表的第i个位置上插入一个元素时,必须先将顺序表中第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。
若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。
[基本要求] 要求生成顺序表时,可以键盘上读取元素,用顺序存储结构实现存储。
[实现提示] 要实现基本操作,可用实现的基本操作,也可设计简单的算法实现。
[程序实现]#include <stdio.h>#include <conio.h>typedef int DataType ;# define maxnum 20typedef struct{int data[maxnum];int length;}SeqList;/*插入函数*/int insert(SeqList *L , int i , DataType x)/* 将新结点x插入到顺序表L第i个位置 */{ int j ;if( i<0 || i>(*L).length +1){ printf(" \n i 值不合法 ! ");return 0;}if((* L).length >=maxnum-1){ printf(" \n 表满不能插入!");return 0;}for(j=(*L).length;j>=i;j--) (*L).data[j+1]=(*L).data[j];(*L).data[i] = x;(*L).length++;return 1;}/*删除函数*/int delete( SeqList *L ,int i)/*从顺序L中删除第i个结点*/{ int j ;if( i<0|| i>(*L).length ){ printf(" \n 删除位置错误 ! ") ;return 0;}for(j=i+1;j<=(*L).length;j++)(*L).data[j-1] =(*L).data[j];(*L).length--;return 1;}/*生成顺序表*/void creatlist(SeqList * L){ int n , i , j ;printf("请输入顺序表 L 的数据个数:\n") ;scanf("%d" , &n) ;for(i=0 ; i<n ; i++){ printf("data[%d] =" , i) ;scanf("%d",&((*L).data[i]));}(*L).length=n-1;printf("\n") ;}/*creatlist *//*输出顺序表 L*/printout(SeqList * L){ int i ;for (i=0 ; i<=(* L).length ; i++){ printf(" data[%d]=", i) ;printf("%d", (*L).data[i]);}/*printout */printf("\n");}main(){ SeqList *L ;char cmd ;int i , t , x;clrscr() ;creatlist(L);do{printf("\ni , I ----- 插入\n") ;printf("d , D ----- 删除\n") ;printf("q , Q ----- 退出\n") ;do{cmd=getchar() ;}while((cmd!='i')&&(cmd!='I')&&(cmd!='d')&&(cmd!='D')&&(cmd!='q')&&(cmd!='Q')); switch(cmd){ case 'i':case 'I':printf("\nPlease input the DATA: ");scanf("%d",&x) ;printf("\nWhere? ");scanf("%d",&i) ;insert(L,i,x) ;printout(L);break ;case 'd':case 'D' :printf("\nWhere to Delete? ");scanf("%d",&i);delete(L,i);printout(L);break ;}}while((cmd!='q')&&(cmd!='Q'));}(二)有序顺序表的合并[问题描述] 已知顺序表la和lb中的数据元素按非递减有序排列,将la和lb表中的数据元素,合并成为一个新的顺序表lc[基本要求] lc中的数据元素仍按非递减有序排列,并且不破坏la和lb表[程序实现]# include <stdio.h># define maxnum 20typedef int DataType ;typedef struct{ DataType data[maxnum] ;int length ;}SeqList ;int MergeQL(SeqList la , SeqList lb , SeqList *lc){ int i , j , k ;if (la.length+1 + lb.length+1>maxnum){ printf("\narray overflow!") ;return 0;}i=j=k=0;while(i<=la.length && j<=lb.length){ if (la.data[i]<=lb.data[j])lc->data[k++]=la.data[i++] ;elselc->data[k++]=lb.data[j++];}/* 处理剩余部分 */while (i<=la.length) lc->data[k++]=la.data[i++];while (j<=lb.length) lc->data[k++]=lb.data[j++];lc->length=k-1;return 1;}main(){ SeqList la={{3,4,7,12,15},4} ;SeqList lb={{2,5,7,15,18,19},5} ;SeqList lc ;int i ;if (MergeQL(la,lb,&lc)){ printf("\n") ;for(i=0;i<=lc.length ; i++)printf("%4d",lc.data[i]);}}六、注意事项1、删除元素或插入元素表的长度要变化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
五邑大学计算机学院数据结构实验指导手册2015年3月目录实验一线性表 (1)1.实验目的 (1)2.实验内容 (1)3.解题思路 (1)实验二栈 (4)1.实验目的 (4)2.实验内容 (4)3.解题思路 (4)实验三队列 (8)1.实验目的 (8)2.实验内容 (8)3.解题思路 (8)实验四二叉树 (12)1.实验目的 (12)2.实验内容 (12)3.解题思路 (12)实验五哈夫曼树 (18)1.实验目的 (18)2.实验内容 (18)3.解题思路 (18)实验六图的基本存储 (21)1.实验目的 (21)2.实验内容 (21)3.解题思路 (21)实验七图的应用 (26)1.实验目的 (26)2.实验内容 (26)3.解题思路 (26)实验八查找 (30)1.实验目的 (30)2.实验内容 (30)3.解题思路 (30)实验九排序 (32)1.实验目的 (32)2.实验内容 (32)3.解题思路 (32)说明 (36)附录实验报告模板 (37)实验一线性表1.实验目的(1)了解线性表的逻辑结构特性是数据元素之间存在着线性关系,在计算机中表示这种关系有顺序存储结构和链式存储结构;(2)掌握这两种存储结构的描述方法;(3)掌握线性表的基本操作(查找、插入、删除);(4)考虑时间和空间复杂度设计算法。
2.实验内容(1)创建一个顺序表,存放在数组A[N]中,元素的类型为整型,设计算法调整A,使其左边的所有元素小于0,右边的所有元素大于0(要求算法的时间复杂度和空间复杂度均为O(n))。
(2)建立一个循环单链表,其节点有prior,data和next三个域,其中data为数据域,存放元素的有效信息,next域为指针域,指向后继节点,prior为指针域,它的值为NULL。
编写一个算法将此表改为循环双链表。
3.解题思路(1)如图1-1所示,设立两个工作指针i和j,i由数组的左端向右移动,查找大于等于0的数,j由数组的右端向左端移动,查找小于0的数,然后交换,如图1-2所示,直到i>=j,调整结束。
图1-1图1-2算法描述(C语言)如下:void quickSwapList(int a[],int n){int i = 0, j = n - 1 ; // n为顺序表的长度,即数的个数while( i < j ){while( a[i] < 0 && i < j ) i ++ ; // 找到左边大于等于0的数while( a[j] >= 0 && i < j ) j -- ; // 找到右边小于0 的数if(i < j ) // 交换{int t = a[i] ; a[i] = a[j] ; a[j] = t ;}i++;j--;}}(2)如图1-3所示,已建有一个单循环链表(带头结点),first指向头结点。
设立两个工作指针p和q,分别指向头结点和第1个结点;执行q->prior=p;,建立第1个结点的前驱指针,如图1-4所示;同步移动工作指针p和q分别指向下一个结点,如图1-5所示,建立q指向结点的前驱,直到q==first为止,再将头结点的前驱设为最后一个结点,如图1-6所示。
图1-3图1-4图1-5图1-6算法描述(C语言)如下:void singleCircleToDoubleCircleLinkList(struct Node *first) {struct Node *p,*q;p=first; //工作指针p指向头结点q=first->next; //工作指针q指向第1个结点while(q!=first){q->prior=p; //置结点q的前驱为指针p指向的结点p=p->next; //移动工作指针pq=q->next; //移动工作指针q}q->prior=p; //置头结点的前驱为最后一个结点}实验二栈1.实验目的(1)理解栈的定义、特点及与线性表的异同;(2)熟悉顺序栈的组织方法,栈满、栈空的判断条件及其描述;(3)掌握栈的基本操作(进栈、退栈等)。
2.实验内容(1)设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达式的值。
(2)设计两个栈S1、S2都采用顺序栈方式,并且共享一个存储区[0,MaxLen-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向、迎面增长的存储方式,如图2-1所示。
设计一个有关栈的入栈和出栈算法。
图2-13.解题思路(1)一般算术表达(中缀表达),如#3*(4+2)/2-5#,#为表达式界定符,逆波兰表达式(后缀表达式),如前述表达的后缀表达式为:3 4 2 + * 2 / 5 -。
设中缀表达式的运算符有+、-、*、/、#五种,运算符的优先级别从高到低为()、*、/、+、-、#;有括号先算括号内,再算括号外的,多层括号由内向外进行。
中缀表达式转换为后缀表达式需要用到一个临时栈optr暂存运算符。
转换算法描述(伪代码)如下:1.将栈optr初始化为#;2.从左至右依次扫描表达式的每个字符,执行下述操作2.1 若当前字符是运算对象,则输出该字符,处理下一个字符;2.2 若当前字符是运算符且优先级别比栈optr的栈顶运算符的优先级高,则将该字符入栈optr,处理下一个字符;2.3 若当前字符是运算符且优先级别比栈optr的栈顶运算符优先级别低,则将栈optr的栈顶元素弹出并输出;2.4 若当前字符是运算符且优先级别与栈optr的栈顶运算符的优先级相等,则将栈optr的栈顶元素弹出,处理下一个字符。
后缀表达式求值,由于后缀表达中所有的计算按运算符出现的顺序从左向右进行,不用再考虑运算符的优先级。
设定一个临时堆栈opnd暂存计算过程的中间结果。
后缀表达式计算算法描述(伪代码)如下:1.初始化栈opnd为空;2.从左到右依次扫描表达式的每一个字符,执行下述操作;2.1 若当前是运算对象,则入栈opnd,处理下一个字符;2.2 若当前字符是运算符,则从栈opnd出栈两个运算对象,执行运算并将结果入栈opnd,处理下一个字符;3.输出栈opnd的栈顶元素,即表达式的运算结果。
(2)两栈共享存储空间,需要解决的关键问题在于如何判断栈满和栈空,由于两栈共享存储空间,入栈和出栈的时候还需要区分是哪个栈。
设lsTop是左栈(数组下标为0的一端为栈底)栈顶指针,rsTop为右栈(数组下标为MaxLen-1的一端为栈底)栈顶指针,显然,当两个栈都为空时,lsTop==-1,rsTop==MaxLen,如图2-2所示;当栈满时,rsTop和lsTop存在以下关系:rsTop==lsTop+1,如图2-3所示。
图2-2图2-3入栈算法描述(C语言)如下://入栈,s=1,入左栈,s=2,入右栈,x为入栈元素void push(int s,int x){if(rsTop==lsTop+1)//栈满{printf("栈已满!\n");return;}if(s==1)//入左栈{lsTop++;dsStack[lsTop]=x;}else if(s==2)//入右栈{rsTop--;dsStack[rsTop]=x;}elseprintf("该栈不存在!\n");return;}出栈算法描述(C语言)如下://出栈,s=1,出左栈,s=2,出右栈,x返回出栈元素,成功函数返回1,否则返回0 int pop(int s,int *x){if(s==1)//出左栈{if(lsTop==-1){printf("栈已空!\n");return 0;}*x=dsStack[lsTop];lsTop--;}else if(s==2)//出右栈{if(rsTop==MaxLen){printf("栈已空!\n");return 0;}*x=dsStack[rsTop];rsTop++;}else{printf("该栈不存在!\n");return 0;}return 1;}实验三队列1.实验目的(1)理解队列的定义、特点及与线性表的异同;(2)熟悉队列的组织方法,队列满、队列空的判断条件及其描述;(3)掌握队列的基本操作(入队、出队等)。
2.实验内容(1)假设以数组sequ[MaxSize]存放环形队列的元素,同时Rear和Len分别指示环形队列中队尾元素的位置和内含元素的个数。
设计相应的入队和出队算法。
(2)某汽车轮渡口,过江渡船每次能载10辆车过江。
过江车辆分别为客车类和货车类,上船有如下规定:同类车先到先上船,客车先于货车上渡船,且每上4辆客车,才允许上一辆货车;若等待客车不足4辆则以货车代替;若无货车等待则允许客车都上船。
设计一个算法模拟渡口管理。
3.解题思路(1)解决问题的关键在于以下两点:如何使用软件的方法构造环形队列和如何通过Rear和Len来确定队头元素所在的位置。
对于第1点,通过模运算来实现,即Rear=(Rear+1)%MaxSize;第2个问题,当队尾元素的下标大于队头元素的下标时,如图3-1所示,显然,Rear-Len+1即为队头元素的下标;当队尾元素的下标小于队头元素的下标时,如图3-2所示,此时队头元素的下标为:(Rear+MaxSize)-Len+1;为使这两种情况统一处理,采用以下表达式来计算队头元素的下标:((Rear+MaxSize)-Len+1)%MaxSize。
队空和队满的问题通过Len的值即可判断出,Len=0显然是队空,Len=MaxSize则为队满。
图3-1图3-2环形队列入队算法描述(C语言)如下://入队void entryQueue(int x){if(Len==MaxSize)//队满{printf("队列已满,不能入队\n");return;}Rear=(Rear+1)%MaxSize;//移动队尾指针sequ[Rear]=x;//入队Len++;//长度加1return;}环形队列出队算法描述(C语言)如下://出队,返回出队元素int exitQueue(void){int x,First;//队头元素的下标if(Len==0)//队空{printf("队列已空,不能出队\n");return -1;}First=((Rear+MaxSize)-Len+1)%MaxSize;//计算队头元素的下标x=sequ[First];//获得队头元素Len--;//长度减1return x;//返回队头元素}(2)建立3个队列,分别为客车队列bus,货车队列truck和渡船队列ferry,设置3个变量标识已上渡船的客车数量busNum、货车数量truckNum和总数量totalNum。