您的位置:首页 > 编程语言 > C语言/C++

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

2017-03-23 11:23 141 查看

队列

在网上又看到关于队列的知识点,有很多,但都比较琐碎,有的还有些错误,为方便自己理解,特整理出一篇,顺便也加强记忆;当然,也附上我参考的博客地址:
http://www.cnblogs.com/kaituorensheng/archive/2013/02/28/2937865.html href="http://http//www.cnblogs.com/kaituorensheng/archive/2013/02/28/2937865.html" target=_blank>点击打开链接

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

队列是一种特殊的线性表,只能在前端(front)进行删除操作,只能在后端(rear)进行删除操作;队列分为顺序队列和循环队列;

顺序队列:

每次插入,指针rear加一,每次删除,指针front加一;(放一张百度的图片)



在第四步中,front=rear,队列虽然判为空,却不能够再进行使用,因此造成了内存的浪费;所以就有了循环队列;

循环队列:

初始化时,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的位置 ; 从这里也可以看出,循环数列所能存储的值其实是最大值-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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  队列 循环队列 c++
相关文章推荐