數據結構(一) -- 循環隊列數組實現

隊列的描述

隊列的主要特徵是先進先出(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

發佈了37 篇原創文章 · 獲贊 24 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章