队列————数组实现

队列和栈是类似的想法,都是比较基础的数据结构,但是越基础的东西越是值得重视。、

下面的实现例程是循环队列,主要增加了一个succ函数来实现循环,也正是这一个函数让整个函数功能更加完整。

操作图示:

QueueRecord.h:

 

#ifndef QUEUERECORD_H
#define QUEUERECORD_H

typedef char ElementType;
struct QueueRecord;
typedef struct QueueRecord *Queue; 

int IsEmpty(Queue Q);
int IsFull(Queue Q);
Queue CreatQueue(int MaxQueueSize);
void MakeEmpty(Queue Q);
void DisposeQueue(Queue Q);
static int Succ(Queue Q, int Value);//循环队列的判断函数
void Enqueue(Queue Q, ElementType X);
void Dequeue(Queue Q);
ElementType Front(Queue Q);
ElementType FrontAndDequeue(Queue Q);

#endif 

 

SequenceQueue.c:

/*循环队列——主要细节在MakeEmpty那里*/
#include"QueueRecord.h"
#include<stdio.h>
#include<stdlib.h>

#define MinQueueSize (5)

struct QueueRecord{
    int capacity;//the fixed size of queue
    int size;//the dynamic size of queue
    int front;
    int rear;
    ElementType *Array;
};

int IsEmpty(Queue Q)
{
    return Q->size == 0;
}

int IsFull(Queue Q)
{
    return Q->capacity == Q->size;
}

Queue CreatQueue(int MaxQueueSize)
{
    Queue Q;
    
    if(MaxQueueSize < MinQueueSize)
        printf("Queue Size is too small!");
        
    Q = (Queue)malloc(sizeof(struct QueueRecord));
    if(Q == NULL)
        printf("Aallocation failure!");
    else
    {
        Q->Array = (ElementType*)malloc(sizeof(ElementType) * MaxQueueSize);
        if(Q->Array == NULL)
            printf("Aallocation failure!");
        else
        {
            Q->capacity = MaxQueueSize;
            MakeEmpty(Q);
        }
    }
    return Q;
}

void MakeEmpty(Queue Q)
{
    Q->size = 0;
    Q->rear = 0;//when enquen a element to queue , rear + 1 make rear == front , 
    Q->front = 1;
}

void DisposeQueue(Queue Q)
{
    if(!IsEmpty(Q))
    {
        free(Q->Array);
        free(Q);
    }
}

//判断是否到队列尾部的函数 static 用来表示只再本程序内
static int Succ(Queue Q, int Value)
{
    if(++Value == Q->capacity)
        Value = 0;
    return Value;
}

void Enqueue(Queue Q, ElementType X)
{
    if(IsFull(Q))
        printf("Queue is full!, can't enqueue!\n");
    else
    {
        Q->rear = Succ(Q, Q->rear);//这里的精妙之处我已无法用英语注释 仔细体会!!! 
        Q->Array[Q->rear] = X;
        Q->size++;
    }
}

void Dequeue(Queue Q)
{
    if(IsEmpty(Q))
        printf("Queue is empty!, can't dequeue!\n");
    else
    {
        Q->front = Succ(Q, Q->front);
        Q->size--;
    }
}

ElementType Front(Queue Q)
{
    if(!IsEmpty(Q))
        return Q->Array[Q->front];
    printf("Sorry the queue is empty! can't find the front element!\n");
    return 0;//return value used to avoid warning!
}

ElementType FrontAndDequeue(Queue Q)
{
    ElementType FrontElement;
    if(!IsEmpty(Q))
    {
        FrontElement = Q->Array[Q->front];
        Q->size--;
        Q->front = Succ(Q, Q->front);
        return FrontElement;
    }
    else
    {
        printf("Sorry the queue is empty! can't find the front element!\n");
        return 0;
    }
}

队列的实现例程精彩之处在succ这个函数的实现与其他教材的 %来实现循环相比个人更喜欢这种方法

 

posted @ 2018-09-06 20:57  克里尔肖  阅读(533)  评论(0编辑  收藏  举报