循环队列的实现方法

来源:互联网 发布:淘宝达人简介怎么写 编辑:程序博客网 时间:2024/05/22 04:43
//C实现方式
#include <stdio.h> 2. #include <stdlib.h>3. #include <stdbool.h>4.5. #define Q_LEN 66.7. typedef struct {8.     int *pBase;9.     int front;10.     int rear;11.}QUEUE;12.13. static void init(QUEUE *pQ) {14.     pQ->pBase = (int *)malloc(sizeof(int) * Q_LEN);15.     pQ->front = 0;16.     pQ->rear = 0;17.}18.19. static inline bool full_queue(QUEUE *pQ) {20.     if((pQ->rear + 1) % Q_LEN == pQ->front)21.         return true;22.     else23.         return false;24.}25.26. static bool en_queue(QUEUE *pQ, int val) {27.     if (full_queue(pQ)) {28.         printf("队列已满, %d 不能被加入队列\n", val);29.         return false;30.     } else {31.         pQ->pBase[pQ->rear] = val;32.         pQ->rear = (pQ->rear + 1) % Q_LEN;33.         return true;34.     }35.}36.37. static void traverse_queue(QUEUE *pQ) {38.     int idx = pQ->front;39.     while (idx != pQ->rear) {40.         printf("%d ", pQ->pBase[idx]);41.         idx = (idx + 1) % Q_LEN;42.     }43.     printf("\n");44.}45.46. static inline bool emput_queue(QUEUE *pQ) {47.     if (pQ->front == pQ->rear) {48.         return true;49.     } else {50.         return false;51.     }52.}53.54. static bool out_queue(QUEUE *pQ, int *pVal) {55.     if (emput_queue(pQ)) { 56.         return false;57.     } else {58.         *pVal = pQ->pBase[pQ->front];59.         pQ->front = (pQ->front + 1) % Q_LEN;60.         return true;61.     }62.}63.64.int main(void) {65.     QUEUE Q;66.     int val;67.68.     init(&Q);69.     en_queue(&Q, 1);70.     en_queue(&Q, 2);71.     en_queue(&Q, 3);72.     en_queue(&Q, 4);73.     en_queue(&Q, 5);74.     en_queue(&Q, 6);75.     en_queue(&Q, 7);76.     en_queue(&Q, 8);77.78.     traverse_queue(&Q);79.80.     if (out_queue(&Q, &val)) {81.         printf("出队成功,队列出队的元素是: %d\n", val);82.     } else {83.         printf("出队失败!\n");84.     }85.86.     traverse_queue(&Q);87.88.     free(Q.pBase);89.     return 0;90.} 


C++实现:

队列特性:先进先出(FIFO)——先进队列的元素先出队列。来源于我们生活中的队列(先排队的先办完事)。

队列有下面几个操作:

  • InitQueue()   ——初始化队列
  • EnQueue()        ——进队列
  • DeQueue()        ——出队列
  • IsQueueEmpty()——判断队列是否为空
  • IsQueueFull()    ——判断队列是否已满

队列可以由数组和链表两种形式实现队列操作(c语言),下面仅以数组为例:

数组实现:

队列数据结构

typedef struct queue{        int queuesize;   //数组的大小        int head, tail;  //队列的头和尾下标        int *q;          //数组头指针}Queue;

InitQueue()   ——初始化队列

void InitQueue(Queue *q){        q->queuesize = 8;        q->q = (int *)malloc(sizeof(int) * q->queuesize); //分配内存        q->tail    = 0;        q->head = 0;}

这样有个缺陷,空间利用率不高。采用循环队列:

 

EnQueue()        ——进队列

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

DeQueue()        ——出队列

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

IsQueueEmpty()——判断队列是否为空

int IsQueueEmpty(Queue *q){        if(q->head == q->tail)        {            return 1;        }        else        {            return 0;        }}

IsQueueFull()——判断队列是否已满

int IsQueueFull(Queue *q){    if((q->tail+1)% q->queuesize == q->head)    {        return 1;    }    else    {        return 0;    }}

 

 

0 0