首先我们要理解队列所遵循的规则就是“先进先出”。我们可以看到生活中排队的例子(如:排队买票、排队打饭)其实就是一个队列。
如同栈一样,为了保证队列的安全性,我们对队列的操作也只有三种:入队列、出队列、取队首元素。
这篇文章主要是用数组来实现一个队列,为了使队列的空间能充分利用,所以用线性队列来模拟环形队列来实现。
#define SeqQueueMaxSize 1000
typedef char SeqQueueType;
typedef struct SeqQueue
{
SeqQueueType data[SeqQueueMaxSize];
size_t head;
size_t tail;
size_t size;
}SeqQueue;
宏SeqQueueMaxSize 是设定了整个数组内可以存放的个数,head 是队首元素在数组内的下表,tail是队尾元素在数组内的下表,size是真个队列中我们存的元素的总个数。
一.队列的初始化
void SeqQueueInit(SeqQueue* q)
{
if (q == NULL)
return;
q->size = 0;
q->head = 0;
q->tail = 0;
return;
}
首先要对指针的非法性判断。
然后将里面的个数置0。我头和尾从0开始。
二.队列的销毁
void SeqQueueDestory(SeqQueue* q)
{
if (q == NULL)
return;
q->size = 0;
q->head = 0;
q->tail = 0;
return;
}
销毁其实和初始化的操作一样。因为我们并不是用malloc开辟的空间,就不需要free来释放。将队列存的元素个数置0,头和尾置0,从0开始。
三.入队列
void SeqQueuePush(SeqQueue* q, SeqQueueType value)
{
if (q == NULL)
return;
if (q->size >= SeqQueueMaxSize)
return;
//q->data[q->size++] = value;//wrong
q->data[q->tail++] = value;//xian yong hou jia
++q->size;
if (q->tail >= SeqQueueMaxSize)
{
q->tail = 0;
}
return;
}
思路:
1.传参:你要入哪个队列,你要入什么元素;
2.首要的还是对指针的合法性做判断;
3.判断是否满了,你还能不能入?
4.在尾部插入新元素;如果新插入的元素已经排到这个队列的最后一个位置了,就需要将tail置0,从头开始。
5.再将整个队列中的元素size++。
四.出队列
void SeqQueuePop(SeqQueue* q)
{
if (q == NULL)
return;
if (q->size == 0)
return;
++q->head;
if (q->head >= SeqQueueMaxSize)
q->head = 0;
--q->size;
return;
}
思路:
1.传参:你要出哪个队列的元素
2.指针的合法性判断
3.判断这个队列是否是空队列
4.出队列,扔掉队首元素。如果此时的head是否已经到了整个队列的最后一个位置,则将head置0,继续从头开始。
5.整个队列的元素个数size--。
五.取队首元素
int SeqQueueTop(SeqQueue* q, SeqQueueType* value)
{
if (q == NULL || value == NULL)
return 1;
if (q->size == 0)
return 1;
*value = q->data[q->head];
return 0;
}
思路:
1.传参:要从哪个队列中取,取出的元素为value。这里的value 是输出型参数。
2.指针的合法性判断。
3.空队列判断。如果是空队列则无法取队首元素。
4.将队首的元素赋值给value。
如果取成功则返回0,失败返回1。
测试函数:
void Test()
{
SeqQueue queue;
SeqQueueInit(&queue);
SeqQueuePush(&queue,'a');
SeqQueuePush(&queue,'b');
SeqQueuePush(&queue,'c');
SeqQueuePop(&queue);
SeqQueueType value;
int temp = SeqQueueTop(&queue, &value);
if (temp == 0)
printf("%c\n", value);
return;
}
int main()
{
Test();
return 0;
}
做了一个简单的测试,并没有把所有特殊情况考虑。
读者可也根据需要,加测试语句。
测试结果:
先初始化一个队列,再入队列三个元素'a' ,'b', 'c',再出一个元素。则队列里剩下'b' , 'c'两个元素,取队首元素,则输出结果为'b'。