码迷,mamicode.com
首页 > 其他好文 > 详细

【数据结构-队列】循环队列

时间:2015-05-09 08:58:26      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:循环队列

关于循环队列

循环队列就是像一个圈一样,可以一直不停的入队和出队,例如:队列已经满了,如果执行一次出队操作,队列头部就空出来了,这时候就可以把元素继续插入空出来的那里,头指针向后移第二个元素就变成的队列的头,上一个对头就变成了队尾

下图中:此时队列已经满了,但是当把12出队后,head指针会指向第1个位置,这是再忘队列中插入元素的,tail就会指向0的位置,然后把元素插入到0的位置。
技术分享

组成循环队列需要的元素

int data[COUNT];//存放元素
int head;//头指针
int tail;//尾指针
int count;//队列中的元素个数,判断队列是否空或者满的重要作用

头指针和尾指针变化的情况

  • 当队列为空的时候,头指针和尾指针都是-1;
  • 入队操作的时候,尾指针向后移动一位,然后插入数据,count++
  • 出队操作的时候,头指针向后移动一位,此时所指的数据就是要出队的元素,count–
  • 头指针变化cq->head = (cq->head + 1) % COUNT;
  • 尾指针变化cq->tail = (cq->tail + 1) % COUNT;

使用C语言实现循环队列

#include<stdio.h>
#define COUNT 10//循环队列可以存储的最多的个数

typedef struct {
    int data[COUNT];//数据区
    int head; //头指针
    int tail;//尾部指针
    int count;//目前队列中的数据个数
}CycleQueue;

/*入队操作+*/
void insert(CycleQueue *cq, int num)
{
    if (cq->count == COUNT) {
        printf("队列现在已经满了\n");
    }
    else {
        cq->tail = (cq->tail + 1) % COUNT;//循环队列,向后移一个位置,如果tail的值为count,则tail就会自动变为0
        cq->data[cq->tail] = num;
        cq->count++;
    }
}

/*出队操作 ,temp为出栈的元素*/
int delete(CycleQueue *cq, int *temp)
{
    if (cq->count == 0) {
        printf("队列已经为空!\n");
        return 0;//出栈失败
    }
    else {
        cq->head = (cq->head + 1) % COUNT;//循环队列,向后移一个位置
        *temp = cq->data[cq->head];//将要出队的那个元素赋值给temp
        cq->count--;//队列中元素个数-1
        return 1;//完成出队
    }
    return 1;
}


int main()
{
    CycleQueue cq;
    cq.head = cq.tail = -1;
    cq.count = 0;
    int temp = 0;//存储出队列的元素
    insert(&cq, 1);
    insert(&cq, 2);
    insert(&cq, 3);
    insert(&cq, 4);
    insert(&cq, 5);

    int count = cq.count;
    for (int i = 0; i < count; i++) {
        delete(&cq, &temp);
        printf("出队元素为%d\n", temp);
    }
    return 0;
}

【数据结构-队列】循环队列

标签:循环队列

原文地址:http://blog.csdn.net/ttf1993/article/details/45585131

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!