队列的实现(数组方式)

来源:互联网 发布:成都软件开发工资 编辑:程序博客网 时间:2024/06/10 05:15

数组方式实现队列,为了避免空间浪费,我们利用循环队列的方式,即当新成员入队时,如果队尾没有空间了,可以查询对头是否有空闲的空间,如果有,则入队,否则不入队。

入队时,只需rear+1,出队时,只需front+1。数组方式的实现,最主要需要考虑两个问题,一个是队列满的情况,一个是队列空的情况,因为入队出队操作都与这两种情况有关联。

首先,我们看下如何判断队列满的情况
1. 见下图
这里写图片描述

判断条件:(rear+1)%LEN == front
2. 见下图
这里写图片描述

判断条件:rear+1 == front
合并在一起,判断是否满的条件为:

(rear+1)%LEN == front

接着,我们看看如何判断队列为空的情况,这个很简单,只需要判断队列的头和尾是否重叠即可,如下

queue->front == queue->rear

代码实现如下

array_queue.h

#ifndef __ARRAY_QUEUE_H__#define __ARRAY_QUEUE_H__typedef int ElementType;typedef int Position;typedef struct ArrQueue_T{    Position front;    Position rear;    ElementType * array;}ArrQueue;typedef struct ArrQueue_T Node;#define ARR_QUEUE_MAX_SIZE 5extern void array_queue_main_test(void);#endif

array_queue.c

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <stdbool.h>#include "array_queue.h"ArrQueue * array_queue_create(void){    ArrQueue * queue = (ArrQueue *)malloc(sizeof(ArrQueue));    if(NULL == queue)    {        printf("queue malloc fail\n");        return NULL;    }    queue->array = (ElementType *)malloc(sizeof(ElementType) * ARR_QUEUE_MAX_SIZE);    if(NULL == queue->array)    {        printf("queue->array malloc fail\n");        return NULL;    }    queue->front = 0;    queue->rear = 0;    return queue;}bool array_queue_is_empty(ArrQueue * queue){    return queue->front == queue->rear;}bool array_queue_is_full(ArrQueue * queue){    return queue->front == ((queue->rear + 1)%ARR_QUEUE_MAX_SIZE);}/*  Insert element, rear+1 */int array_queue_in(ArrQueue * queue, ElementType elem){    if(true == array_queue_is_full(queue))    {        printf("queue is full, cannot insert\n");        return -1;    }       queue->array[queue->rear] = elem;    queue->rear = (queue->rear + 1) % ARR_QUEUE_MAX_SIZE;    return 0;}/*  Delete element, front+1 */int array_queue_out(ArrQueue * queue){    if(true == array_queue_is_empty(queue))    {        printf("queue is empty, cannot delete\n");        return -1;    }    queue->front = (queue->front + 1) % ARR_QUEUE_MAX_SIZE;    return 0;}void array_queue_traverse(ArrQueue * queue){    int i = queue->front;    while(i != queue->rear)    {        printf("value=%d\n", queue->array[i]);        i = (i+1)%ARR_QUEUE_MAX_SIZE;    }}void array_queue_main_test(void){    ArrQueue * q = array_queue_create();    array_queue_in(q, 1);    array_queue_in(q, 2);    array_queue_in(q, 3);    array_queue_in(q, 4);    array_queue_out(q);    array_queue_out(q);    array_queue_in(q, 5);    array_queue_in(q, 6);    array_queue_in(q, 7);    array_queue_traverse(q);}
0 0
原创粉丝点击