数据结构实验报告—队列
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法与数据结构》课程
一、实验目的
掌握队列的存储结构及进队/出队等操作的实现。
二、实验内容及要求
1.实现队列的一种存储结构。
2.实现队列的相关操作。
3.利用队列的操作特点,借助进队与出队操作完成打印二项式系数的任务。
三、系统分析
(1)数据方面:该队列数据元素类型采用整型,在此基础上进行队列的一些基本操作,应用体现在打印二项式系数即打印杨辉三角形。
(2)功能方面:
1.进队操作:若队列不满,则将元素x进入队列。
2.出队操作:若队列不空,则退出队头元素x并由函数返回true,否则返
回false。
3.获取队头元素:若队列不为空,则函数返回true及队头元素的值,否则
返回false。
4.判断队列是否为空、判断队列是否满。
5.计算队列中元素个数:直接返回队列中元素个数。
6.清空队列内容:队头指针和队尾指针置0。
7.打印杨辉三角形前n行数字。
四、系统设计
(1)设计的主要思路
队列得基于数组得存储表示亦称为顺序队列,是利用一个一维数组作为队列元素的存储结构,并且设置两个指针front和rear,分别指示队列的队头和队尾位置。每当添加一个新元素时,先将新元素添加到rear所指位置,再让队尾指针
rear进1。每当退出队头元素,应当先把front所指位置元素记录下来,再让队头指针进1,指示下一队头元素位置,最后把记录下来的元素值返回。
但当队头指针front==rear,队列为空;而当rear==maxSize时,队列满,如果再加入新元素,就会产生“溢出”。但这种“溢出”可能时假溢出,因为在数组的前端可能还有空位置。为了能够充分地使用数组中的存储空间,把数组的前端和后端连接起来,形成一个环形表,即把存储队列元素的表从逻辑上看成一个环,成为循环队列。循环队列的首尾相接,当队头指针front和队尾指针rear进到maxSize-1后,再前进一个位置就自动到0.这可以利用除法取余的运算实现。(2)数据结构的设计
队列的定义是一种限定存取位置的线性表。它只允许在表的一端插入,在另一端删除。允许插入的一端叫做队尾,允许删除的一端叫做队头。最先进入队列的元素最先退出队列,队列这种特性叫做先进先出。
空队列
A进队
对头指针进1:front=(front+1)%maxSize;
队尾指针进1:rear=(rear+1)%maxSize;
队列初始化:front=rear=0;
循环队列的队头指针和队尾指针初始化时都设置为0:front=rear=0.在队尾插入新元素和删除队头元素时,两个指针都按顺时针方向进1.当它们进到maxSize-1时,并不表示表的终结,只要有需要,利用%运算可以前进到数组的0号位置。
五、编程环境与实验步骤
(1)编程环境
操作系统:Windows操作系统;编程工具软件:Visual Studio 2017
(2)实验步骤
无文件操作。
(3)编译参数
无特殊的编译参数设置。
六、实现代码
主要功能的实现代码
杨辉三角函数:
void YANGVI(int n) {
Queue
int i = 1; int j = 0; int s = 0, k = 0; int t, u;
q.EnQueue(i); q.EnQueue(i);
for (i = 1; i <= n; i++) {
q.EnQueue(k);
for (j = 1; j <= i + 2; j++) {
q.DeQueue(t);
u = s + t;
q.EnQueue(u);
s = t;
a[0] = 1;
if (j != i + 2) {
a[o] = s; o++;
}
}
}
}
杨辉三角形输出显示函数:
void Show(int *a, int n) {
int i, j; int sum = 0; int k = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n - i - 1; j++)
cout << setw(3) << " ";//前导空格,为单个数据的一半宽度
for (j = 0; j <= i; j++) {
cout << setw(6) << a[sum + j];
k++;
}
sum = k;
cout << endl;
}
}
SeqQueue循环队列模板:
template
class Queue {
public:
Queue(int sz = 100);
~Queue() { delete[]elements; }
bool EnQueue(T &x);
bool DeQueue(T &x);
bool getFront(T &x);
void makeEmpty() { front = rear = 0; }
bool IsEmpty();
bool IsFull();
int getSize();
friend ostream& operator<<(ostream &os, Queue
int rear, front;
T *elements;
int maxSize;
};
template
Queue
rear = 0; front = 0;