数据结构之表、栈和队列(四)

队列

队列本质上也是一种链表,与栈不同的是队列是在一端插入,另一端删除。换句话说,队列的模型是先进先出。

与栈类似,队列也可以用链表的方式进行实现,其运算复杂度为 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);
    }
}

 

实际中计算机服务器提交任务就是队列模式。

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值