循环队列

队列是一种特殊的线性表,与堆、栈有点类似,但是队列值允许从队列的前端(Front)进行出队(删除),队列的后端进行插入(进队)。

实际的应用中,使用的是循环的队列。

循环队列的本质:是一个数组,只不过这个数组是可以被循环地进行存放数据。

2、循环队列的创建

typedef struct Queue
{
    int *pBase;
    int Front;
    int Rear;
}QUQUQ,*PQUEUE;

pBase : 指针,指向的是数组地址

Front : 指向的是队列的一个存放元素的单元,出队也是这里进行出队哦、

Rear:指向的是队列存放元素最后一个单元的下一个单元,这里进行进队。所以说,N 个单元循环队列(数组),只能保存 N-1 数据。

当循环队列是空的时候, Front 等于 Rear,而为满的时候,Front = (Rear + 1)%N;d

 

3、代码

typedef struct Queue
{
    int *pBase;
    int Front;
    int Rear;
}QUQUQ,*PQUEUE;


// 循环队列的初始化
void init_queue(PQUEUE pTR)
{

    pTR->pBase = (int *)malloc(sizeof(int) * 6);
    // 进队和出队指向同一个位置
    pTR->Rear = pTR->Front = 0;

}

// 判断是否队列已经满了
bool is_full_queue(PQUEUE pTr)
{
    PQUEUE pNew = pTr;

    if ( pNew->Front == (pNew->Rear + 1) % 6)
    {
        return true;
    }
    else
    {
        return false;
    }
}


void insert(PQUEUE pTr, int iVal)
{
    PQUEUE pNew = pTr;
    if (is_full_queue(pTr))
    {
        printf("满的队列,不能插入咯\n");
    }

    pNew->pBase[pNew->Rear] = iVal;
    pNew->Rear = (pNew->Rear + 1) % 6;

}


// 遍历循环队列
void traver_queue(PQUEUE pTr)
{
    int i = pTr->Front;
    while (i != pTr->Rear)
    {
        printf("%d\n", pTr->pBase[i]);
        i = (i + 1) % 6;
    }
}


// 判断队列是否为空
bool is_empty_queue(PQUEUE pTr)
{
    if ( pTr->Front ==  pTr->Rear)
    {
        return true;
    }
    else
    {
        return false;
    }
}

// 出队的操作
void out_queue(PQUEUE pTr)
{
    PQUEUE pNew = pTr;
    
    if (is_empty_queue(pNew))
    {
        printf("空队列");
        exit(-1);
    }

    printf("出队的数据是:%d", pNew->pBase[pNew->Front]);
    pNew->Front = (pNew->Front + 1) % 6;

}


int main(int argc, char **argv)
{
    // 创建一个队列
    QUQUQ QQ;

    init_queue(&QQ);

    // 入队
    insert(&QQ, 1);
    insert(&QQ, 2);
    insert(&QQ, 3);
    insert(&QQ, 4);
    insert(&QQ, 5);

    // 遍历队列
    traver_queue(&QQ);

    // 出队
    out_queue(&QQ);


    while (1);
}
posted @ 2016-02-27 17:14  qxj511  阅读(308)  评论(0编辑  收藏  举报