1、栗子

学校食堂打饭、火车站买火车票、公交站等车,都要排队,先来的先上车,车满了,其余只能等下一班了。

这对大多数人而言,都是相对公平的方式。

先到先得

在算法中,也有类似的公平——队列(queue)。

队列遵循**先进先出(First In First Out,简写FIFO)**的规则,同栈的实现一样,队列的实现也有数组实现和链表实现两种方式。

数组实现和链表实现没有绝对的优劣,平时接触数据比较多,所有首选数组实现啦。

2、准备工作

队列主要在结构上包括了指向队首和队尾的两个指针,存储数据的线性表。

操作上,主要包括入队(Enqueue)、出队(Dequeue)。

队列

我们可以使用数组维护队列。

/*
输出:1 2 3 4 5
*/

#include <stdio.h>
#include <string.h>
int main()
{
	int a[5];
	int head = 0, tail = 0;

	int i = 1;

	//入队
	while (i <= 5) {
		a[tail++] = i;
		i++;
	}

	//出队,当head==tail时,说明队列为空
	while (head < tail)
		printf("%d ", a[head++]);

	getchar();getchar();
	return 0;
}

3、结构体

int、char等属于基本的数据类型,是构成C语言(或者语言的基础),但在表示复杂的数据类型的时候,基本语言就不够用了。

比如表示一个同学的姓名、性别、学号、成绩,如果使用基本数据类型,就显得臃肿,而且缺少相互之间的关联。

char name[100][10];
char sex[100];
int number[100];
int grade[100];

结构体可以解决数据冗余的问题,结构体基于基本的数据类型。

使用下列结构

struct name{
};

例如上述的学生可以表示为:

struct student {
	char name[10];
	char sex;
	int number;
	int grade;
};
struct student stu[100];

直接对stu[100]进行操作就可以了。

4、使用结构体

建立下述结构体表示队列。

struct queue{
	int a[5];
	int head, tail;
};

对上述同样的代码使用结构体重新表示。

/*
输出:1 2 3 4 5
*/

#include <stdio.h>
#include <string.h>
struct queue{
	int a[5];
	int head, tail;
};
int main()
{
	//队列初始化
	struct queue q;
	q.head = 0;q.tail = 0;

	int i = 1;

	//入队
	while (i <= 5) {
		q.a[q.tail++] = i;
		i++;
	}

	//出队,当head==tail时,说明队列为空
	while (q.head < q.tail)
		printf("%d ", q.a[q.head++]);

	getchar();getchar();
	return 0;
}

乍一看,使用结构体不仅没有减小工作量,反而增加了!

这不是错觉,但如果增加题目复杂度,不断的有出队和入队操作呢?要不断的对head和tail进行操作,非常麻烦。

如果将queue队列单独表示,并对出队和入队操作进行封装,可以极大减小写代码的行数。(这种操作其实就是面向对象了,属于C++和JAVA语言的特征了)

有兴趣可以自己搜索下哈。