一、实验目的和要求
设计并实现杨辉三角形输出。
二、实验环境
编译器:Vscode DevC++
系统:Windows10
CPU:i5-8265U@1.60GHz
三、实验内容
基于课后作业04内容,存储结构采用链式存储。基于链队列,尽量少的改动课后作业-04代码,完成杨辉三角形输出。要求抽象出链队列结构进行独立实现(建议直接利用 课堂作业-04代码)。
四、实验过程
4.1 任务定义和问题分析
构建功能完备的链队列 能够实现入队、出队、返回队头值、判空、判满等功能。
仅需要在之前的队列类文件中修改即可
4.2 数据结构的选择和概要设计
链队列:
先构造了一个模板结构体
template <typename DataType>
struct node
{
DataType data;
node *next;
node *last;
};
这里虽然设置的是双端队列的样式 但并没有怎么体现双端队列的优势
即可看作简单的单向队列 毕竟要实现的只有一个方向的入队 出队;
enum E_code
{
success,
underflow,
overflow
};
4.3 详细设计
int count;
node<DataType> *front, *rear;
初始化时要将指针指向NULL 清空计数器
front = NULL;
rear = NULL;
count = 0;
判空操作 只需要检测计数器是否为0
判满操作 一直返回非满即可
接下来实现 返回队头 队尾(因为之前类似双端队列的设置可以实现返回对胃元素)
根据计数器是否为零(判空操作)来判断队列是否为空
如果空 就输出提示语:the queue is empty 并结束操作 return underflow
如果非空 就利用front和rear进行数据的读取(这里 front和rear直接可以存储数据 没有绕到下一个进行存储)
入队操作:由于有两个指针变量 所以在队列不为空情况下的进队 我对rear进行了特殊化处理 (由于front和rear可以直接存储数据)同理 在队列为空时对front进行了特殊化处理
出队操作:首先对队列的计数器进行了判断
如果空 则输出the queue is empty it can't pop 并return underflow
否则就进行常规清楚队头结点
析构操作:为了对间接访问区进行delete 遍历整个队列
完成以上功能之后 将头文件进行更新即可
五、测试及结果分析
5.1 实验数据
10以下的数据:5 & 8
20以下的数据:13&17
20以上的数据:22
5.2 结果及分析
由于沿用的还是上一次的main函数 所以对于数据还是有限制
不过能在20以内有着很好的适用
六、实验收获
再次熟悉了链队列的操作
七、参考文献
无
八、附录(源代码)
yhsj.cpp
// #include"My_Queue_first.h"
#include "My_Queue_second.h"
#include<cstdio>
// Queue<int> q(101);
Queue<int>q;
int n;
void init()
{
q.InsertQueue(0);
q.InsertQueue(1);
q.InsertQueue(0);
}
void work(int x)
{
int l = 0, r = 0;
q.InsertQueue(0);
q.PopTop(r);
// r = q.PopTop();
for (int i = 1; i <= x; i++)
{
l = r;
q.PopTop(r);
// r = q.PopTop();
if (i == 1 && x == n)
printf("%3d", r);
else
printf("%6d", r);
q.InsertQueue(r + l);
}
cout << "\n";
l = r;
q.PopTop(r);
// r = q.PopTop();
q.InsertQueue(l + r);
q.InsertQueue(0);
}
void kprint(int num, int x)
{
if (num == x)
return;
int len = (num - x - 1) * 3;
for (int i = 1; i <= len; i++)
{
cout << " ";
}
}
int main()
{
init();
cin >> n;
for (int i = 1; i <= n; i++)
{
kprint(n, i);
work(i);
}
system("pause");
}