队列的基础知识及实现方法

队列

 

在网上又看到关于队列的知识点,有很多,但都比较琐碎,有的还有些错误,为方便自己理解,特整理出一篇,顺便也加强记忆;当然,也附上我参考的博客地址:

http://www.cnblogs.com/kaituorensheng/archive/2013/02/28/2937865.html点击打开链接

队列定义:队列属于先进先出型,First in first out(FIFO)

队列是一种特殊的线性表,只能在前端(front)进行删除操作,只能在后端(rear)进行插入操作;

队列分为顺序队列和循环队列;

顺序队列:

每次插入,指针rear加一,每次删除,指针front加一;

 

循环队列:

初始化时,rear = front=0,当队列不为空时,front指向队列中的第一个元素,rear指向队列中最后一个元素的下一个位置,当队列满时 rear=front,但不一定是位置0;

插入后rear+1,删除后front+1,但是,无论是删除还是插入,一旦rear或front加一超过了所分配的空间,则让指针指向这片空间的起始位置;设所分配的空间为Maxsize,一旦rear+1,或front+1 =Maxsize, 则rear或front指向起始位置;如上图,当front和rear都在位置3事,此时如果想要插入,则判断3+1=4 与Maxsize 4的关系,相等,则rear=0,这个可以通过取余实现,rear=(rear+1)%Maxsize;

因此,循环序列判空的方法是rear = front; 判满的方法是 (rear+1)%Maxsize ==front;

进队列步骤: 1.判断队列是否满,即,rear+1是否等于front,若等于则队列已满,不允许进入;2. 若不满,则将值保存至rear+1的位置 ; 从这里也可以看出,循环数列所能存储的值其实是Maxsize-1, 如上图所示, maxsize是4, 若front =0, rear =3,这时位置3为空,但是判断的3+1 =4,则rear=(rear+1)%4 =0,则rear = front,显示队列已满,所以不能再插入,而其实还有一个空位。

void EnQueue(Queue *Q, int key)
{

        if ( (Q->rear+1) % Q->maxsize == Q->front)                   //此时队列没有空间       取余保证,当quil=queuesize-1时,再转回0
        {
            printf("the queue has been filled full!");
        }
        else
        {
          Q->q[Q->rear] = key;

            Q-> rear =(Q->rear+1) % Q->maxsize;
        }
}

出队列步骤:1.判断数列是否为空; 2, 将front现在的时间表保存至temp; 3,将front指针后移一个;4. 返回temp;

int DeQueue(Queue *Q)
{
        int tmp;
        if(Q->rear== Q->front)     //判断队列不为空
        {
            printf("the queue is NULL\n");
        }
        else
        {
            tmp = Q->q[q->front];
            Q->front= (Q->front+1) % Q->maxsize;
        }
        return tmp;
}

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值