1.基本含义:
毋庸置疑,队列是一种先进先出的数据结构,如生活中的排队,叫号机等待,等等,
2.非结构体方法:
定义一个数组 q,存放队列的值,一个head代表指向的队首,一个tail代表指向的队尾的下一个元素(这是为了判别是否为空。
我们不妨假设,head == tail的时候队列为空。
删除队首操作(出队): head++;(虽然直接指向下一个会浪费空间,但是却减少了移动一群数字的时间。)
添加元素操作(入队):q[tail] = x; tail++;(先添加元素,然后,tail向后移)
int q[100]; //队列存放到数组中
int head; //存放头
int tail; //存放尾
/*初始化*/
head = 1;
tail = 10; //假设从1开始利用,且一共有9个元素,则tial指向最后一个元素的下一个位置。
/*删除元素*/
head++;
/*增加元素,如增加元素x */
q[tail] = x;
tail++;
例子:比如有一串数字,我们按照要求,令第一个元素删除,第二个元素跟到这串数字后面,第三个元素删除,第四个元素跟到后面,然后把删除后的一串新的数字打印出来。 eg : 6 3 1 7 5 8 9 2 4 ,进过这样的转化后,成为:6 1 5 9 4 7 2 8 3。
思路:先用队列将其存储起来,第一个数字先打印,然后出队,然后将第二个元素值插到队尾,再将第二个元素出队,。。。。直到队列没有元素,则打印出来的数字集合就是这串新数字。
代码详解:
#include <stdio.h>
int main()
{
int q[102] = {0,6,3,1,7,5,8,9,2,4};
int head = 1;//我们从一开始
int tail = 10;//tail指向最后一个元素的下一个位置
while(head < tail)
{
//先将队首打印出来,并处对
printf("%d ",q[head]);
head++;
//再将新队首的数添加到队尾
q[tail] = q[head];
tail++;
//再将队首出队
head++;
}
return 0;
}
3.结构体方法:
由上面我们可以清楚的知道,队列需要三个元素:1个数组存放队列的信息,2个int值存放队首和队尾的信息。因此可以将他们设成一个结构体,方便操作。即:
struct queue
{
int data[102];
int head;
int tail;
};
同样,入队和出队操作也与此对应。
struct queue q;//定义一个结构体元素q
/*入队*/
q.data[tail] = x;
tail++;
/*出队*/
q.head++;
同样上面的例子给出完整的代码:
#include <stdio.h>
struct queue
{
int data[102];
int head;
int tail;
};
int main()
{
int i;
struct queue q;
//初始化队列
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++;
}
return 0;
}
上面看起来比原来麻烦多了,但是对我们理解思想有很大的帮助。
4.表示感谢:
《啊哈算法》,值得推荐,建议把上面的代码打一打,很有意思。