数据结构复习之[循环队列]

来源:互联网 发布:Java接口技术 编辑:程序博客网 时间:2024/05/02 02:53

这算是我第一篇原创吧,就写一写我今天的学习笔记。

以下复习笔记来自郝斌老师的数据结构视频,在verycd下免费下载,通俗易懂的特点是初学者不可多得的。

线性结构的两种常见应用之二队列

定义:

一种可以实现先进先出的存储结构。

分类:

离散(链式)队列--用链表实现


静态(连续)队列--用数组实现

静态队列通常必须是循环队列


循环队列的必须要弄清除的7个问题:

1.静态队列为什么必须是循环队列

由于连续空间的问题,为了节省空间,方便操作,速度快等优点。

2.循环队列需要几个参数来确定

需要2个参数来确定


3.循环队列各个参数的含义

2个参数不同场合有不同的含义


1).队列初始化

front = rear = 0

2).队列非空

front代表的是队列的第一个元素

rear代表的是队列的最后一个有效元素

3).队列空

front = rear  但不一定为零

4.循环队列入队伪算法讲解

两步完成:

1.将值存入rear所代表的位置

2.错误的写法:rear rear 1

  正确的写法rearrear 1)%数组的长度 


5.循环队列出队伪算法讲解

frontfront 1)%数组的长度


6.如何判断循环队列是否为空

如果front rear的值相等,

则该队列就一定为空


7.如何判断循环队列是否已满

预备知识:

front的值可能比rear大,可能比他小,也可能相等

两种方式:

1.多增加一个标识参数

2.不用数组的最后一个元素[通常使用第二种方式]

如果rear front的值紧挨着,则队列已满

if((rear1)%数组长度== front

已满

else

不满


循环队列程序演示:

#include <stdio.h>#include <stdlib.h>#define M 6 //数组长度#define bool char //c语言中没有bool类型,自己添加的#define true 1#define false 0typedef struct Queue{    int * pBase;//数组首地址,相当于数组名    int front;    int rear;}QUEUE;void init(QUEUE *);//初始化队列bool en_queue(QUEUE *,int);//入队列bool out_queue(QUEUE *, int *);//出队列void traverse_queue(QUEUE *);//遍历队列bool full_queue(QUEUE *);//判断队列是否为满bool empty_queue(QUEUE *);//判断队列是否为空int main (int argc, const char * argv[]){        QUEUE Q;    int val;    init(&Q);    //测试数据    en_queue(&Q, 1);    en_queue(&Q, 2);    en_queue(&Q, 3);    en_queue(&Q, 4);    en_queue(&Q, 5);    en_queue(&Q, 6);    en_queue(&Q, 7);    en_queue(&Q, 8);    traverse_queue(&Q);        if (out_queue(&Q, &val))    {        printf("出队成功,队列出队元素为:%d\n",val);    }    else        printf("出队失败!");        traverse_queue(&Q);    return 0;}void init(QUEUE *pQ){//初始化队列    pQ->pBase = (int *)malloc(sizeof(int) * M);    pQ->front = 0;    pQ->rear = 0;    return;}bool full_queue(QUEUE * pQ){//队列是否为满    if ((pQ->rear + 1) % M == pQ->front) {        return true;    }    else         return false;}bool en_queue(QUEUE * pQ,int val)  {//入队列    if (full_queue(pQ)) {        return false;    }    else    {        pQ->pBase[pQ->rear] = val;        pQ->rear = (pQ->rear + 1) % M;        return true;    }}void traverse_queue(QUEUE * pQ){//遍历队列    int i = pQ->front;        while(i != pQ->rear)    {        printf("%d  ",pQ->pBase[i]);        i = (i+1) % M;    }    return; }bool empty_queue(QUEUE * pQ){//队列是否为空    if (pQ->front == pQ->rear) {        return true;    }    else        return false; }bool out_queue(QUEUE * pQ, int * pVal){//出队列    if (empty_queue(pQ)) {        return false;    }    else    {        *pVal = pQ->pBase[pQ->front];        pQ->front = (pQ->front + 1) % M;        return true;    }}

本程序经macwindows下测试通过。


队列的具体应用:

所有和时间有关的操作都有队列的影子,比如操作系统中的调度原则等。


原创粉丝点击