- 2
- 0
- 约1.75千字
- 约 9页
- 2017-05-01 发布于湖北
- 举报
队列的存储与操作讲述教程
成 绩评阅人
重庆邮电大学
课程设计实验报告
班级:1301416
姓名:陈昊
学号:2014214156
指导老师:夏晨洋
课程名称:数据结构
实验时间:2015年10月26日-2015年11月2日
实验地点:数字图书馆负一楼B132
实验四 队列的存储与操作
一、实验目的
1.理解队列是限定只能在队头进行删除操作在队尾进行插入操作的线性表;
2.理解队列的存储结构特点,掌握队列的存储分配要点;
3.掌握队列的基本操作及实现,深刻领会队列操作的先进先出特征,并能正确分析其时间复杂度,知道队列性能优于普通线性表,以及队列的常用情形。
二、主要数据结构描述
class CirQueue
{
public:
CirQueue( ); //构造函数,置空队
~ CirQueue( ); //析构函数
void EnQueue(T x); //将元素x入队
T DeQueue( ); //将队头元素出队
T GetQueue( ); //取队头元素(并不删除)
bool Empty( ); //判断队列是否为空
private:
T data[QueueSize]; //存放队列元素的数组
int front, rear; //队头和队尾指针,分别指向队头元素的前一个位置和队尾元素的位置
};
在循环队列这个数据结构中,需要一个构造函数,来创建一个空的队列;需要一个析构函数来删除队列;需要一个EnQueue()函数来插入一个数据;需要一个DeQueue()函数来将队头的元素出队;需要一个DeQueue()函数来输出队头的值;需要一个布尔型的函数来判断队列是否为空。
三、算法的基本思想描述
1.构造函数:令头指针和尾指针均为零。
2.析构函数:空的析构函数。
3.入队函数:函数的形参为将存入队列的数据的值。因为判空和判满都需要用到rear==front,所以在判满的操作中,对rear+1取模,在循环的意义下进行判断。如果(rear+1)% QueueSize==front,那么队满。如果没有队满,那么就在循环+1下标的位置存入当前数据。
4.出队操作:这里的出队不是删除相应的数据,而是将队头指针+1。首先判断队是否为空,如果不为空就将队头指针在循环意义上+1。
5.取队头元素:将队头元素的值取出。
6.判空:如果rear==front则为空,否则不为空。
因为不涉及循环,所以所有函数的时间复杂度都为O(1)。
运行的结果截图
实验体会和收获
经过本次试验。我对循环队列有了更深的理解。了解了队列先进先出的特点。知道了如何运用队列解决相应的问题。
六、程序清单。
CirQueue.h
CirQueue.cpp
CirQueueMain.cpp
链队列
链队列与顺序队列大致相同,只是用链表来表示而已。链队列的队头指针指向头结点,队尾指针指向终端节点。
基本数据结构:
class LinkQueue
{
public:
LinkQueue( ); //构造函数,初始化一个空的链队列
~LinkQueue( ); //析构函数,释放链队列中各结点的存储空间
void EnQueue(T x); //将元素x入队
T DeQueue( ); //将队头元素出队
T GetQueue( ); //取链队列的队头元素
bool Empty( ); //判断链队列是否为空
private:
NodeT *front, *rear; //队头和队尾指针,分别指向头结点和终端结点
};
思想与顺序队列一致。需要注意的是对节点的增加和删除。在EnQueue()中,将新申请的节点接在rear后,再让rear=新节点。在DeQueue()中,要暂存队头元素,用来返回,再摘链。
运行结果和程序:
原创力文档

文档评论(0)