队列的实现-链表

像栈一样,队列也是表。然而,使用队列时插入在一端进行,删除在另一端进行。

队列的基本操作是Enqueue(入队),它是在表的末端(叫做队尾),和Dequeue(出队),它是删除在表头的元素(叫做对头)。

上代码:

typedef int ElementType;
struct QueueRecord;
typedef struct QueueRecord *Queue;

struct QueueRecord
{
    int capability;//队列可容纳长度
    int head;//对头
    int tail;//队尾
    int size;//队列的实际长度
    ElementType *Array;
};

当在队尾增加一个元素时,tail+1;

当对头删除一个元素是,head+1;

当tail,head移到数组最后一个位置后,下一次将重新移到数组开始的地方。

int Isempty( Queue Q )
{
    return Q->size == NULL;
}

int IsFull( Queue Q )
{
    return Q->size == Q->capability;
}
Queue CreateQueue( int MaxElements )
{
    Queue queue = (Queue)malloc(sizeof(struct QueueRecord));
    queue->capability = MaxElements;
    queue->head = 1;//初始化队列。tail始终指向队尾的元素,开始时没有元素指向0.当有一个元素时,指向1,此时head就正好也指向第一个元素。
    queue->tail = 0;
    queue->size = 0;
    queue->Array = (ElementType*)malloc(sizeof(ElementType)*MaxElements);
    return queue;
}
/*入队列*/
void Enqueue(ElementType X, Queue Q )
{
    if(!IsFull(Q))
    {
        Q->tail=(++Q->tail)%Q->capability;
        Q->Array[Q->tail] = X;
        Q->size++;
    }
    else printf("queue is full!");
    
}
/*出队列*/
void Dequeue( Queue Q )
{
    if(!Isempty(Q))
    {
        Q->head = (++Q->head) % Q->capability;
        Q->size--;
    }
    else printf("queue is empty!");

}
/*返回队列的第一个元素值*/
ElementType Front( Queue Q )
{
    return Q->Array[Q->head];
}

 

posted @ 2016-08-13 23:28  九杯水  阅读(106)  评论(0)    收藏  举报