参考:啊哈磊算法
/*
需求:首先将第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数再放到这串数的末尾,再将第5个数删除……
直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是小哈的QQ啦。
现在你来帮帮小哼吧。小哈给小哼加密过的一串数是“6 3 1 75 8 9 2 4”。
分析:
我们来小结一下,在队首删除一个数的操作是head++;
在队尾增加一个数(假设这个数是x)的操作是q[tail]=x;tail++;
*/
#include<stdio.h>
int main(){
int q[101]={0,6,3,1,7,5,8,9,2,4},head,tail;
//初始化队列,0下标不用
head=1;
tail=10; //tail指向队尾元素的后一个元素,这样好处理队列中只有一个元素时的情况,并且当head=tail时,队列为空
while(head<tail){
printf("%d ",q[head]);
head++;
q[tail]=q[head];//注意这时tail的位置
tail++;
head++;
}
getchar();
return 0;
}
//队列将是我们今后学习 广度优先搜索以及队列优化的Bellman-Ford最短路算法的核心数据结构
所以现在将队列的三个基本元素(一个数组,两个变量)封装为一个结构体类型,如下。
struct queue
{
int data[100];//队列的主体,用来存储内容
int head;//队首
int tail;//队尾
};
上面我们定义了一个结构体类型,我们通常将其放在main函数的外面。
请注意结构体的定义末尾有个;号。struct是结构体的关键字,queue是我们为这个结构体起的名字。
你可以这么理解:我们定义了一个新的数据类型,这个新类型非常强大,
用这个新类型定义出的每一个变量可以同时存储一个整型数组和两个整数。
请注意struct queue需要整体使用,
请注意struct queue需要整体使用,不能直接写queue q;这样我们就定义了一个结构体变量q。这个结构体变量q就可以满足队列的所有操作了。那又该如何访问结构体变量的内部成员呢?可以使用.号,它叫做成员运算符或者点号运算符,如下:
q.head=1;
q.tail=1;
scanf("%d",&q.data[q.tail]);
好了,下面这段代码就是使用结构体来实现的队列操作。
#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[q.tail]);
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++;
}
getchar();getchar();
return 0;
}