图解--队列
- 最终的效果
- 接下来 我们要做的就是 使用编程实现这种意识形态下的结构
- 创建队列结构体
- 初始化init
- 进队入队 尾部插入
- 队列的判断满操作
- 出队
- 队列是否为空
- 遍历队列
- 代码的操作交互
- 意识
最终的效果
1.队列的结构形式
队列是一种线性结构 但是特殊的线性结构
只要的特殊在于
- 队列存在一个头 一个尾
- 队列的操作存在与两端
- 存在先进后出的限制条件
接下来 我们要做的就是 使用编程实现这种意识形态下的结构
创建队列结构体
//创建结构体 queue
struct Queue {
int* pBase;
int front;
int real;
};
pBase 指向连个连续的内存的首地址
front 队列的头
real 队列的尾部 但是指向最后一个元素的下一个位置 (便于操作)
初始化init
void init(Queue* pQ) {
//初始化 queue的
//1. 申请内存
pQ->pBase = (int*)malloc(sizeof(int) * 7);
if (pQ->pBase == NULL) {
printf("地址分配失败");
}
//2.初始化 front real
pQ->front = 0;
pQ->real = 0;
//结束
return;
}
进队入队 尾部插入
bool in_queue(Queue* pQ, int value) {
//进队之前看看队列是否已满
if (isfull(pQ) == true) {
printf("队列已满 不可操作");
return false;
}
else {
//real 的位置放入 value
pQ->pBase[pQ->real] = value;
//real ++
pQ->real = (pQ->real + 1) % 7;
return true;
}
}
pQ->real = (pQ->real + 1) % 7; 不是直接的++ 或是+1
因为那样的话 real 不超出下标存在队列 溢出
所谓pQ->real = (pQ->real + 1) % 7 pQ->real 就只能在 0-6之间的位置循环
这也就是所谓的循环队列
常见的形式是这样的
队列的判断满操作
但是上面不常用
而是用第二种方法
bool isfull(Queue* pQ) {
//判断是否未满
if ((pQ->real + 1) % 7 == pQ->front) {
return true;
}
else {
return false;
}
}
出队
//出队列
bool out_queue(Queue* pQ, int* value) {
//判断队列是否为空
if (empty(pQ)) {
printf("当前为空 不可出队列");
return false;
}
else {
//front 上移动
*value = pQ->pBase[pQ->front]; //把删除的值 返回出去
pQ->front = (pQ->front + 1) % 7;
return true;
}
}
队列是否为空
//判断是否为空
bool empty(Queue* pQ) {
//判断 real 和 front 是否相同
if (pQ->real == pQ->front) {
return true;
}
else {
return false;
}
}
遍历队列
//遍历队列
void travel(Queue* pQ) {
//获取队列的头 front
int t = pQ->front;
while (t != pQ->real) {
printf("%d ,", pQ->pBase[t]);
t = (t + 1) % 7;
}
printf("\n");
}
代码的操作交互
int main() {
Queue Qu;
//1.初始化 操作
init(&Qu);
//2.进队
in_queue(&Qu, 1);
in_queue(&Qu, 2);
in_queue(&Qu, 3);
in_queue(&Qu, 4);
in_queue(&Qu, 5);
//3.遍历
travel(&Qu);
//4.出队列
int key;
if (out_queue(&Qu, &key)) {
printf("出队列完成 %d \n", key);
}
else {
printf("出队列失败");
}
travel(&Qu);
//5.进队列
in_queue(&Qu, 77);
//6.出队列
int key1;
if (out_queue(&Qu, &key1)) {
printf("出队列完成 %d \n", key1);
}
else {
printf("出队列失败");
}
travel(&Qu);
//交互处理
while (true) {
printf("请输入1.进队 2出队的数值 1或2\n");
int s;
scanf("%d", &s);
if (s == 1) {
printf("in\n");
int x;
scanf("%d", &x);
getchar();
in_queue(&Qu, x);
//插入ok
printf("插入完成\n");
travel(&Qu);
}
if (s == 2) {
int key11;
if (out_queue(&Qu, &key11)) {
printf("出队列完成 %d \n", key11);
}
else {
printf("出队列失败");
}
travel(&Qu);
}
}
return 0;
}
意识
当我写出来的时候我自己都觉得不可思议
以前老师讲完全不懂 自己在blibli看郝斌
感觉好像来了 就废了几个小时 搞这个
其实上面的东西还是有的没讲清楚 就像是循环队列
为什么要用循环对了 …但是我尽力了
我觉得战胜了自己一次
但是我也意识到了
大学的老师是真的不会讲课
他们好像离开了PPT 就再也不知道怎么讲了
而且大学的老师 好像从来都不怎么写代码
而是在讲代码 直接不知道从哪来的代码截图
直接搞到PPT上面 然后不知道怎么就过去了
然后同学们自己看看 不会的问 …
然后有个同学说指针不太懂
老师好像下不了台了
就说 你们大学没学过c语言么 课下再好好看看把 数据结构的重点不是代码
考试不考试这个 大家看不懂也没关系
有的时候不是那些东西有多难
而是给你讲那些东西的人他自己也不会 但是他们不敢说罢了
不会的人给你讲他自己也不太会的东西 只能跳过
所以你觉得难 就不搞了
所以我觉得我们应该找一些懂得人才行
以上这些只用于我的大学数据结构的课
因为我明显能感受到 老师和那些所谓培训结构老师讲课的差距
请不要引申到别的地方