二 队列、栈、链表
1 解密QQ号——队列
1 任务:对一串数字顺序操作。每次操作扔掉队首的数字,再把第二个数移动到队尾,重复这个操作,直至将这一串数字全部删除。
2 思路:引入两个整型变量head和tail。head表示队首,tail表示队尾+1。删除队首,对应着head+1,把数字x移动到队尾,对应着a[tail]=x,tail++。
3 总结
队列。队列是一种特殊的线性结构,它只允许在队列的首部(head)进行删除操作,称为“出队”,在队尾(tail)进行插入操作,称为“入队”。当队列中没有元素时(即head = tail ),称为“空队列”。生活中很多场景都是队列,比如买火车票,排队打饭等等。为先来的人先服务,称为先入先出原则(First In First Out,FIFO)。
队列是今后学习广度优先搜索、队列优化的Bellman-Ford最短路径算法的核心数据结构。所以现在将队列的三个基本元素(一个数组,两个变量)封装为一个结构体类型,如下:
struct queue //struct 是结构体的关键字,queue是我们为这个结构体起的名字。这个结构体有三个成员,分别是:整型数组data,整型head和整型tail。
//结构体可以理解为一个新的数据类型。我们现在定义的是数据类型
{
int data[100];//队列的主体,用来存储内容
int head;//队首
int tail;//队尾
};//注意!这里有分号。
struct queue q;//这是在定义结构体类型的变量。注意这里struct 和 queue 要整体使用,都写出来。
4 示例代码:
#include <stdio.h>
struct queue
{
int data[100];//队列的主体,用来存储内容
int head;//队首
int tail;//队尾
};
int main()
{
struct queue q;
int i;
//初始化队列
q.head = 1;
q.tail = 1;
for (i=1; i<=9; i++)
{
//依次输入9个数
scanf("%d", &q.data[i]);
q.tail++;
}
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;
}