数据结构实验报告 栈和队列

时间:2024.4.20

20##级数据结构实验报告

实验名称:实验二栈和队列

    期: 20081115

1.实验要求

实验目的

通过选择下面五个题目之一进行实现,掌握如下内容:

进一步掌握指针、模板类、异常处理的使用

掌握栈的操作的实现方法

掌握队列的操作的实现方法

学习使用栈解决实际问题的能力

学习使用队列解决实际问题的能力

实验内容

2.1题目1

根据栈和队列的抽象数据类型的定义,按要求实现一个栈或一个队列。

    要求:

1、  实现一个共享栈

2、  实现一个链栈

3、  实现一个循环队列

4、  实现一个链队列

编写测试main()函数测试线性表的正确性。

2. 程序分析

2.1 存储结构

存储结构:

特殊线性表:栈,队列

 

2.2 关键算法分析

共享栈的入栈算法伪码(Push):

1.如果栈满,抛出上溢异常。

2.判断是插在栈1还是栈2:

2.1如果在栈1插入,则栈顶指针top1加1,在top1处填入元素x;

2.2如果在栈2插入,则栈顶指针top2加1,在top2处填入元素x。

共享栈的出栈算法伪码(Pop):

1. 判断是在栈1删除还是在栈2删除。

2. 若是在栈1删除,则

2.1 若栈1为空栈,抛出下溢异常;

2.2 删除并返回栈1的栈顶元素;

3. 若是在栈2删除,则

3.1 若栈2为空栈,抛出下溢异常;

3.2 删除并返回栈2的栈顶元素。

共享栈的取栈顶元素算法伪码(GetTop):

1.  判断是在栈1取还是栈2取;

2.  如果在栈1取,则

2.1 若栈1不空,返回栈顶元素的值,不删除;

2.2 若栈1空,返回0;

3.如果在栈2取,则

3.1 若栈2不空,返回栈顶元素的值,不删除;

3.2 若栈2空,返回0。

链栈的入栈算法伪码(Push):

1.  申请一个新的结点,数据域为x;

2.  将新结点插在栈顶;

3.  栈顶指针重新指向栈顶元素。

链栈的出栈算法伪码(Pop):

1.  如果栈空,抛出下溢异常;

2.  暂存栈顶元素;

3.  将栈顶结点摘链;

4.  删除该结点,返回该元素的值。

链栈的取栈顶元素算法的伪码(GetTop):

1.  如果栈非空,返回栈顶元素的值,不删除。

循环队列的入队算法伪码(EnQueue):

1.  如果队满,抛出上溢异常;

2.  队尾指针在循环意义下加1;

3.  在队尾插入元素。

循环队列的出队算法伪码(DeQueue):

1.  如果队空,抛出下溢异常;

2.  队头指针在循环意义下加1;

3.  读取并返回出队前的队头元素。

循环队列的取队头元素算法伪码(GetQueue):

1.  如果队空,抛出下溢异常;

2.  值为队头指针的工作指针i在循环意义下加1,注意不给队头指针赋值;

3.  返回队头指针的队头元素。

链队列的入队算法伪码(EnQueue):

1.  申请一个数据域为x的新结点;

2.  该结点的next域置空;

3.  将其插到队尾。

链队列的出队算法伪码(DeQueue):

1.  如果队空,抛出下溢异常;

2.  暂存队头元素;

3.  将队头元素所在结点摘链;

4.  如果被删除的队头元素同时也是队尾元素,则修改队尾指针。

链队列的取队头元素算法伪码(GetQueue):

1.  如果队非空,返回队头元素的值,不删除。

以上算法的时间复杂度均为O(1)。可比较的是空间性能。初始时顺序栈必须确定一个固定的长度,所以有存储元素个数的限制和空间浪费的问题。链栈没有栈满的问题,只有当内存没有可用空间时才会出现栈满。但是每个元素都需要一个指针域,所以产生了结构性开销。循环队列和链队列的空间性能的比较与顺序栈和链栈的空间性能比较类似,只是循环队列不能像顺序栈那样共享空间,通常不能在一个数组中存储两个循环队列。

3.  程序运行结果

 

测试条件:主函数都大都采用了使用循环来入栈(队)(链队列除外),问题规模取决于栈本身的大小,而链队列和链栈不受限制(除非内存没了)。每次入栈(队)、出栈(队)、取栈顶(队头)元素前后都执行函数Empty()判断栈(队列)是否为空。

测试结论:程序可以正常且正确运行。

4.        总结   

1、  调试时出现的问题及解决的方法

对循环队列进行测试时,由于之前设定的队列的大小是10,故在入队时设定的k最大为9了即k<10,然而运行时程序出错,于是试着把k<10改为了k<9,重新运行便无问题了。这是因为循环队列实际上是留出了一个空的数组元素空间,以便判断队是否已满,所以实际上最多只能储存9个元素。故k=0;k<9。

但后来添加了异常处理,故而改为可以由用户自行输入元素值。

2、  心得体会

这次选择的题目非常基本,是共享栈、链栈、循环队列、链队列的基本实现,相对也比较容易,但却是很基础的,有些细节部分是值得高度重视的,也是容易出错的地方,例如上所写的测试循环队列时出现的问题。

对这些基本的特殊线性表的测试与实现是编写较复杂程序的基础,应该牢固掌握它们。

这个实验也让我学会了异常处理的方法。

3、  下一步的改进

由于近期处于期中考试阶段,所以没能选择更有难度的题目做,但实际上这道题虽然看似简单但在很多地方也是容易出错的。改进方面,链表由于一般没有上限(除非没有内存),就自己预设了一个数组存放入栈(队)的元素,其实应该也可以设为让用户自己来输入。

循环队列:

共享栈:

链队列:

链栈:


第二篇:数据结构实验报告2-栈和队列


北京物资学院信息学院实验报告

课程名 数据结构(C++)实验

实验名称 栈和队列算法的实现

实验日期 年 月 日 实验报告日期 年 月 日 姓 名 ______ ___ 班 级_____ _______ 学 号___

一、实验目的

1. 掌握栈和队列的顺序存储和链接存储数据结构;

2. 掌握栈和队列顺序存储和链接存储的基本操作;

3. 会初步应用栈和队列;

二、实验内容

栈部分

1. 实现顺序栈的所有操作算法,并自编主函数证实它们的正确性。

2. 利用栈实现数制转换(十进制-八进制或十进制-二进制)算法。

3. 递归:【习题4-4】1, 2, 6 (1);

4. 【习题4-4】8. 注意双栈的顺序存储结构,可设MaxSize为10。按要求实现下列算法:

4.1初始化:栈1和栈2置空;

void InitStack(BothStack& BS) ;

4.2判断栈是否为空:当k=1或k=1时判断对应的栈1或栈2是否为空: bool StackEmpty(BothStack& BS,int k);

4.3进栈:当k=1或k=1时向对应的栈1或栈2的栈顶压入元素:

void Push(BothStack& BS,int k,ElemType item);

4.4退栈:当k=1或k=1时对应的栈1或栈2退栈并返回栈顶元素: ElemType Pop(BothStack& BS,int k);

4.5遍历栈:当k=1或k=1时遍历对应的栈1或栈2:

void OutputBStack(BothStack& BS,int k);

并自编主函数证实它们的正确性。

5. 实现链栈的操作功能(P137-138)

队列部分

1.实现循环队的操作功能(P163-164)

2. 编写一个输出循环队的算法,其功能为:

从队首到队尾依次输出队中所有元素;

输出队首单元号、队尾单元号;

输出队中的元素个数。

3. 建立一个有10个单元的循环队,准备15个待进队的元素,并完成以下操作: 前7个元素进队;3个元素出队;后续5个元素进队;4个元素出队;3个元素 1

进队。

每个操作之后都要:输出队列;输出队首单元号、队尾单元号和队中的元素个数。

4. 实现链队的操作功能(P166-167)(选作)

综合题

键盘输入(或用其他方式提供原始数据)若干字符,用正序和逆序输出它们。(选作)

三、实验地点与环境

3.1 实验地点

(南实验楼 教室)

3.2实验环境

(所用语言环境)

四、实验步骤

1.

2.

3.

?

五、实验结果与分析

5.1 实验结果 (原始数据,预期结果和运行结果)

序号 算法名称(函数名)

与功能

1

2

3

函数名: 功 能:

说明

5.2 分析

(选择部分算法分析,包括函数参数说明、调试中所遇到的问题和解决方法、中间结果等,必要时给出函数和主函数的关键段落。所选算法应是:重要的算法、有编程特点的算法等)

所在头文件名 主函数所在文件名 头文件: CPP文件: 原始数据: 运行结果: 原始数据与 运行结果* * 如果不能按“原始数据”、“运行结果”列出数据则不列,必要时在“分析”部分

六、小结

(收获与心得)

2

更多相关推荐:
数据结构实验报告

实验报告实验课程:数据结构实验项目:实验专业:计算机科学与技术姓名:**学号:***指导教师:**实验时间:20**-12-7重庆工学院计算机学院数据结构实验报告实验一线性表1.实验要求掌握数据结构中线性表的基…

数据结构实验报告(C语言)(强力推荐)

数据结构实验实验内容和目的掌握几种基本的数据结构集合线性结构树形结构等在求解实际问题中的应用以及培养书写规范文档的技巧学习基本的查找和排序技术让我们在实际上机中具有编制相当规模的程序的能力养成一种良好的程序设计...

数据结构实验———图实验报告

数据结构实验报告目的要求掌握图的存储思想及其存储实现掌握图的深度广度优先遍历算法思想及其程序实现掌握图的常见应用算法的思想及其程序实现实验内容键盘输入数据建立一个有向图的邻接表输出该邻接表3在有向图的邻接表的基...

数据结构实验报告格式

数据结构实验报告格式实验11顺序表的基本操作一实验目的1掌握使用VC上机调试线性表的基本方法2掌握线性表的基本操作插入删除查找等运算在顺序存储结构上的实现二实验内容顺序表的基本操作的实现三实验要求1认真阅读和理...

数据结构实验报告5

计算机科学与工程系计算机科学与工程系2计算机科学与工程系附录可包括源程序清单或其它说明includeltiostreamgtincludeltstdiohgtusingnamespacestdtypedefst...

数据结构实验报告全集

数据结构实验报告全集实验一线性表基本操作和简单程序1实验目的1掌握使用VisualC60上机调试程序的基本方法2掌握线性表的基本操作初始化插入删除取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法2实...

数据结构实验报告[4]

云南大学数据结构实验报告第四次实验学号姓名一实验目的复习线性表的逻辑结构存储结构及基本操作掌握顺序表和带头结点单链表了解有序表二实验内容必做题假设有序表中数据元素类型是整型请采用顺序表或带头结点单链表实现Ord...

数据结构树的实验报告

数据结构实验报告目的要求1掌握二叉树的存储实现2掌握二叉树的遍历思想3掌握二叉树的常见算法的程序实现实验内容1输入字符序列建立二叉链表2中序遍历二叉树递归算法3中序遍历二叉树非递归算法最好也能实现先序后序非递归...

数据结构实验报告

武汉大学国际软件学院实验报告课程名称专业年级姓名学号协作者实验学期课堂时数填写时间月6小结对本次实验的心得体会所遇到的问题及解决方法其他思考和建议7指导教师评语及成绩指导教师依据学生的实际报告内容用简练语言给出...

数据结构第一次上机实验报告

数据结构第一次上机实验报告线性表实验要求1实现顺序表结构的创建插入删除查找等操作2利用上述顺序表操作实现如下程序建立两个顺序表表示的集合集合中无重复的元素并求这样的两个集合的并交和源程序C实现visualstu...

数据结构实验报告(重邮)5个

学号数据结构实验报告学院班级姓名实验一线性链表的实现与操作题目设计一个100位以内的长整数加减运算的程序班级姓名学号完成日期一需求分析1本实验中100位长整数的每位上的数字必须为数字09之间长整数的位数并要求1...

安徽工业大学数据结构实验报告

安徽工业大学计算机学院数据结构实验报告姓名学号班级教师内容线性表基本操作的实现栈的基本操作串的模式匹配二叉树操作图的创建与遍历20xx525实验一线性表基本操作的实现一实验目的1掌握使用TurboC20上机调试...

数据结构 实验报告(45篇)