队列的数组实现(C语言描述)

17 篇文章 0 订阅
10 篇文章 0 订阅

队列也是一种简单却很有用的数据结构,其特点是先进先出,基本操作是enqueue(入列)和dequeue(出列)
下面给出数组实现的代码:

#ifndef QUEUE_H_INCLUDED
#define QUEUE_H_INCLUDED

struct QueueRecord;
typedef struct QueueRecord * Queue;
typedef double ElementType;

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);
ElementType Front(Queue Q);
void Dequeue(Queue Q);
ElementType FrontAndDequeue(Queue Q);

#endif // QUEUE_H_INCLUDED

实现:

#include "Queue.h"
#include <stdlib.h>

/* Queue implementation is a dynamically allocated array */
/* 用一个动态数组来实现队列 */

struct QueueRecord
{
    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 = 1;
    Q->Rear = 0;
}

Queue CreatQueue(int MaxElements)
{
    Queue queue = malloc(sizeof(struct QueueRecord));
    queue->Array = malloc(sizeof(ElementType)*MaxElements);
    if(queue == NULL || queue->Array == NULL)
        FatalError("Something Error");
    queue->Capacity = MaxElements;
    MakeEmpty(queue);
}

static int Succ(int value,Queue Q)
{
    if(++value == Q->Capacity)
        value = 0;
    return value;
}

void Enqueue(ElementType X,Queue Q)
{
    if( IsFull( Q ) )
        FatalError("Full queue");
    else
    {
        Q->Size++;
        Q->Rear = Succ(Q->Rear,Q);
        Q->Array[ Q->Rear ] = X;
    }
}

int IsFull(Queue Q)
{
    return Q->Size == Q->Capacity;
}

void Dequeue(Queue Q)
{
    if(IsEmpty(Q))
        FatalError("Empty queue");
    else
    {
        Q->Size--;
        Q->Front = Succ(Q->Front,Q);
    }
}

ElementType FrontAndDequeue(Queue Q)
{
    ElementType Tmp;
    if(IsEmpty(Q))
        Error("Empty queue");
    else
    {
        Q->Size--;
        Tmp = Q->Array[Q->Front];
        Q->Front = Succ(Q->Front,Q);
        return Tmp;
    }
}

void DisposeQueue( Queue Q )
{
    free(Q->Array);
    free(Q);
}

void Error(char * error)
{
    printf("%s",error);
}

void FatalError(char * fatalerror)
{
    printf("%s",fatalerror);
    return 0;
}
int main()
{
    Queue q = CreatQueue(200);
    int i;
    for(i = 1; i <= 110; i++)
        Enqueue(i,q);
    for(i = 1;i <=100; i++)
       printf("%lf\n",FrontAndDequeue(q));
    return 0;
}

同样的,在最后加上了main函数用于测试。测试结果如下图:

测试结果

注:代码改编自《数据结构与算法分析:C语言描述》第二版

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值