#学自《啊哈!算法》#
目录
一、队列是什么?
队列是一种特殊的线性结构,它只允许在队列的首部(
head
)进行删除操作,这称为“出队”,而在队列的尾部(tail
)进行插入操作,这称为“入队”。当队列中没有元素时(即
head==tail
),称为
空队列。在我们的日常生活中有很多情况都符合队列的特性。比如我们之前提到过的买票,
每个排队买票的窗口就是一个队列。在这个队列当中,新来的人总是站在队列的最后面,来
得越早的人越靠前,也就越早能买到票,就是先来的人先服务,我们称为“先进先出”(
First
In First Out
,
FIFO
)原则。
说白了就是只能对队首进行删除操作,对队尾进行添加操作
二、代码
1. 定义一个结构体,包含队列主体,队首下标和队尾下标
struct queue
{
int data[100];//队列的主体,用来存储内容
int head;//队首
int tail;//队尾
};
2.示例: 解密 QQ 号——队列
规则是这样的:首先将第
1
个数删除,紧接着将第
2
个数放到
这串数的末尾,再将第
3
个数删除并将第
4
个数放到这串数的末尾,再将第
5
个数删除……
直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一
起就是
QQ
。
#include <Stdio.h>
typedef struct queue
{
int data[100];//队列的主体,用来存储内容
int head;//队首
int tail;//队尾
}queue;
int main()
{
queue q;
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &q.data[i]);
q.head = 0;
q.tail = n;//比存储数量多一位
while(q.head<q.tail)//当队列不为空
{
printf("%d",q.data[q.head]);//打印即将删除的队首
q.head++;//将队首出列
q.data[q.tail]=q.data[q.head];//新队首插至队尾
q.tail++;
q.head++;//新的队首
}
return 0;
}
总结
上面的这种写法看起来虽然冗余了一些,但是可以加强你对队列这个算法的理解。