队列
队列本质上也是一种链表,与栈不同的是队列是在一端插入,另一端删除。换句话说,队列的模型是先进先出。
与栈类似,队列也可以用链表的方式进行实现,其运算复杂度为 O(1) ,下面介绍一种数组实现队列的方式:
队列的数据结构:
数组 Queue[] 、队列的头 Front 、队列的尾 Rear 和 队列中元素的个数 Size;
队列的操作:
元素 X 入队: Size ++ 、Rear ++、Queue[Rear] = X
元素出队: 返回 Queue[Front] 、Size-- 、Front++
当然还有其它的实现策略。但是按照上述思路,假设我们的队列大小为10,则Rear 很快就会达到10,之后入队的元素将被安排在不存在的位置,但是在我们实际应用过程中,队列大小一般都不是很大,出队和入队应该有一个平衡。我们可以用 “循环数组” 的方式来设计队列数组。当 Front 和 Rear 到达数组尾端之后,又跳回到数组起始位置。
#ifndef _Queue_h
struct QueueRecord;
typedef struct QueueRecord *Queue;
int IsEmpty(Queue Q);
int ISFull(Queue Q);
Queue CreatQueue(int MaxElements);
void DisposeQueue(Queue Q);
void MakeEmpty(Queue Q);
void Enqueue(ElementType X, Queue Q);
void Dequeue(Queue Q);
ElementType FrontAndDequence(Queue Q);
#endif /*_Queue_h*/
#define MinQueueSize(5);
struct
{
int Capacity;
int Front;
int Rear;
int Size;
ElementType *Array;
}
int
IsEmpty(Queue Q)
{
return Q->Size == 0;
}
void
MakeEmpty(Queue Q)
{
Q->Size = 0;
Q->Front = 0;
Q-Rear = 0;
}
static int
Succ( int Value,Queue Q)
{
if(++Value == Q->Capacity)
Value = 0;
return Value;
}
void
Enqueue(ElementType X,Queue Q)
{
if(IsFull(Q))
Error("Full queue");
else
{
Q->Size++;
Q->Rear = Succ(Q->Rear,Q);
Q->Array[Q->Reaar] =X;
}
}
void
Dequeue(Queue Q)
{
if(IsEmpty(Q))
Error("Empty queue");
else
{
Q->Size--;
Q->Front = Succ(Q->Front,Q);
}
}
实际中计算机服务器提交任务就是队列模式。