数据结构(一) -- 循环队列数组实现

来源:互联网 发布:手机淘宝新用户注册 编辑:程序博客网 时间:2024/05/21 03:57

队列的描述

队列的主要特征是先进先出(FIFO),这意味着先进入队列的元素将会首先出队,与生活中的排队一样。


循环队列

为了更好的利用资源,在编程时,经常把队列实现为循环队列(不懂自行百度,太多讲解了)。

注:在循环队列中空和满的条件需要注意,本文实例采用牺牲一个位置的实现方式。


循环队列接口定义

int initQueue(queueT *queue, int size);                 /* 初始化队列,size为队列长度 */int destroyQueue(queueT *queue);                        /* 销毁队列 */int queueIsEmpty(queueT *queue);                        /* 队列是否为空 */int queueIsFull(queueT *queue);                         /* 队列是否为满 */int enqueue(queueT *queue, queueElementT element);      /* 入队 */int dequeue(queueT *queue, queueElementT *element);     /* 出队 */void queueTraverse(queueT *queue);                      /* 遍历打印队列中元素 */

循环队列实现

< queue.h >

#ifndef __QUEUE_H__#define __QUEUE_H__typedef int queueElementT;typedef struct {    int head;    int rear;    int size;    queueElementT *contents;}queueT;int initQueue(queueT *queue, int size);                 /* 初始化队列,size为队列长度 */int destroyQueue(queueT *queue);                        /* 销毁队列 */int queueIsEmpty(queueT *queue);                        /* 队列是否为空 */int queueIsFull(queueT *queue);                         /* 队列是否为满 */int enqueue(queueT *queue, queueElementT element);      /* 入队 */int dequeue(queueT *queue, queueElementT *element);     /* 出队 */void queueTraverse(queueT *queue);                      /* 遍历打印队列中元素 */#endif

< queue.c >

#include <stdio.h>#include <stdlib.h>#include "queue.h"int initQueue(queueT *queue, int size){    queue->contents = (queueElementT *)malloc(sizeof(queueElementT) * (size + 1)); //由于牺牲了一个位置,所以分配时多分配一个位置    if(queue->contents == NULL) {        perror("malloc");        return -1;    }    queue->head = 0;    queue->rear = 0;    queue->size = size + 1;    return 0;}int destroyQueue(queueT *queue){    free(queue->contents);    queue->contents = NULL;} int queueIsEmpty(queueT *queue){    if(queue->head == queue->rear) {        return 1;    }    return 0;}int queueIsFull(queueT *queue){    if(((queue->rear + 1) % queue->size) == queue->head) {        return 1;    }    return 0;}int enqueue(queueT *queue, queueElementT element){    if(queueIsFull(queue)) {        printf("queue is full\n");        return -1;    }    queue->contents[queue->rear % queue->size] = element;    queue->rear = (queue->rear + 1) % queue->size;    return 0;}int dequeue(queueT *queue, queueElementT *element){    if(queueIsEmpty(queue)) {        printf("queue is empty\n");        return -1;    }    *element = queue->contents[queue->head % queue->size];    queue->head = (queue->head + 1) % queue->size;    return 0;}void queueTraverse(queueT *queue) {    int i;    if(queueIsEmpty(queue)) {        printf("queue is empty\n");        return;    }    i = queue->head;    while(1) {        printf("%d\n", queue->contents[i]);        if((i + 1) % queue->size == queue->rear) {            break;        }        i = (i + 1) % queue->size;    }}


github地址(含Makefile和测试代码)

https://github.com/zsirkg/myWorks/tree/master/algorithms_and_data_structures/queue/array

0 0
原创粉丝点击