队列的实现(数组方式)

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

入队时,只需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 5

extern 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值