学校食堂打饭、火车站买火车票、公交站等车,都要排队,先来的先上车,车满了,其余只能等下一班了。
这对大多数人而言,都是相对公平的方式。
在算法中,也有类似的公平——队列(queue)。
队列遵循先进先出(First In First Out,简写FIFO)的规则,同栈的实现一样,队列的实现也有数组实现和链表实现两种方式。
数组实现和链表实现没有绝对的优劣,平时接触数据比较多,所有首选数组实现啦。
队列主要在结构上包括了指向队首和队尾的两个指针,存储数据的线性表。
在操作上,主要包括入队(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;
}
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]进行操作就可以了。
建立下述结构体表示队列。
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语言的特征了)
有兴趣可以自己搜索下哈。
原文地址:http://blog.51cto.com/10163636/2119652