数据结构图解--队列 的实现/算法+源码

图解--队列

  • 最终的效果
  • 接下来 我们要做的就是 使用编程实现这种意识形态下的结构
  • 创建队列结构体
  • 初始化init
  • 进队入队 尾部插入
  • 队列的判断满操作
  • 出队
  • 队列是否为空
  • 遍历队列
  • 代码的操作交互
  • 意识

最终的效果

数据结构图解--队列 的实现/算法+源码_第1张图片
1.队列的结构形式

队列是一种线性结构 但是特殊的线性结构
只要的特殊在于

  1. 队列存在一个头 一个尾
  2. 队列的操作存在与两端
  3. 存在先进后出的限制条件

数据结构图解--队列 的实现/算法+源码_第2张图片
数据结构图解--队列 的实现/算法+源码_第3张图片

接下来 我们要做的就是 使用编程实现这种意识形态下的结构

创建队列结构体

//创建结构体 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;
}

数据结构图解--队列 的实现/算法+源码_第4张图片

进队入队 尾部插入

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;
	}
}

数据结构图解--队列 的实现/算法+源码_第5张图片

pQ->real = (pQ->real + 1) % 7; 不是直接的++ 或是+1
因为那样的话 real 不超出下标存在队列 溢出
所谓pQ->real = (pQ->real + 1) % 7 pQ->real 就只能在 0-6之间的位置循环
这也就是所谓的循环队列
常见的形式是这样的
数据结构图解--队列 的实现/算法+源码_第6张图片

队列的判断满操作

数据结构图解--队列 的实现/算法+源码_第7张图片
但是上面不常用
而是用第二种方法
数据结构图解--队列 的实现/算法+源码_第8张图片

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;
	}

}

数据结构图解--队列 的实现/算法+源码_第9张图片

队列是否为空

//判断是否为空 
bool empty(Queue* pQ) {
	//判断 real 和 front 是否相同

	if (pQ->real == pQ->front) {
		return true;
	}
	else {
		return false;
	}
}

数据结构图解--队列 的实现/算法+源码_第10张图片

遍历队列

//遍历队列
void travel(Queue* pQ) {
	//获取队列的头 front

	int t = pQ->front;
	while (t != pQ->real) {
		printf("%d ,", pQ->pBase[t]);
		t = (t + 1) % 7;
	}
	printf("\n");
}

数据结构图解--队列 的实现/算法+源码_第11张图片

代码的操作交互

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;

}

数据结构图解--队列 的实现/算法+源码_第12张图片

意识

当我写出来的时候我自己都觉得不可思议
以前老师讲完全不懂 自己在blibli看郝斌
感觉好像来了 就废了几个小时 搞这个
其实上面的东西还是有的没讲清楚 就像是循环队列
为什么要用循环对了 …但是我尽力了
我觉得战胜了自己一次
但是我也意识到了
大学的老师是真的不会讲课
他们好像离开了PPT 就再也不知道怎么讲了
而且大学的老师 好像从来都不怎么写代码
而是在讲代码 直接不知道从哪来的代码截图
直接搞到PPT上面 然后不知道怎么就过去了
然后同学们自己看看 不会的问 …
然后有个同学说指针不太懂
老师好像下不了台了
就说 你们大学没学过c语言么 课下再好好看看把 数据结构的重点不是代码
考试不考试这个 大家看不懂也没关系

有的时候不是那些东西有多难
而是给你讲那些东西的人他自己也不会 但是他们不敢说罢了
不会的人给你讲他自己也不太会的东西 只能跳过
所以你觉得难 就不搞了
所以我觉得我们应该找一些懂得人才行

以上这些只用于我的大学数据结构的课
因为我明显能感受到 老师和那些所谓培训结构老师讲课的差距
请不要引申到别的地方

你可能感兴趣的:(数据结构,数据结构,算法,java)