zoukankan      html  css  js  c++  java
  • 6.队列的数组实现

    fatal.h

    #include <stdio.h>
    #include <stdlib.h>
    
    #define Error(Str)        FatalError(Str)
    #define FatalError(Str)   fprintf(stderr, "%s
    ", Str), exit(1)
    

    queuear.h

    typedef int ElementType;
    
    #ifndef _Queue_h
    #define _Queue_h
    
    struct QueueRecord;
    typedef struct QueueRecord *Queue;
    
    int IsEmpty(Queue Q);
    int IsFull(Queue Q);
    Queue CreateQueue(int MaxElements);
    void DisposeQueue(Queue Q);
    void MakeEmpty(Queue Q);
    void Enqueue(ElementType X, Queue Q);
    ElementType Front(Queue Q);
    void Dequeue(Queue Q);
    ElementType FrontAndDequeue(Queue Q);
    
    #endif  
    

    queuear.c

    #include "queuear.h"
    #include "fatal.h"
    #include <stdlib.h>
    
    #define MinQueueSize ( 5 )
    
    struct QueueRecord
    {
        int Capacity;
        int Front;
        int Rear;
        int Size;
        ElementType *Array;
    };
    
    int IsEmpty(Queue Q)
    {
        return Q->Size == 0;
    }
    
    int IsFull(Queue Q)
    {
        return Q->Size == Q->Capacity;
    }
    
    Queue CreateQueue(int MaxElements)
    {
        Queue Q;
    
        if (MaxElements < MinQueueSize)
            Error("Queue size is too small");
    
        Q = malloc(sizeof(struct QueueRecord));
        if (Q == NULL)
            FatalError("Out of space!!!");
    
        Q->Array = malloc(sizeof(ElementType) * MaxElements);
        if (Q->Array == NULL)
            FatalError("Out of space!!!");
        Q->Capacity = MaxElements;
        MakeEmpty(Q);
    
        return Q;
    }
    
    void MakeEmpty(Queue Q)
    {
        Q->Size = 0;
        Q->Front = 1;
        Q->Rear = 0;
    }
    
    void DisposeQueue(Queue Q)
    {
        if (Q != NULL)
        {
            free(Q->Array);
            free(Q);
        }
    }
    
    static int Succ(int Value, Queue Q)
    {
        if (++Value == Q->Capacity)
            Value = 0;
        return Value;
    }
    
    void Enqueue(ElementType X, Queue Q)
    {
        if (IsFull(Q))
            Error("Full queue");
        else
        {
            Q->Size++;
            Q->Rear = Succ(Q->Rear, Q);
            Q->Array[Q->Rear] = X;
        }
    }
    
    ElementType Front(Queue Q)
    {
        if (!IsEmpty(Q))
            return Q->Array[Q->Front];
        Error("Empty queue");
        return 0;  /* Return value used to avoid warning */
    }
    
    void Dequeue(Queue Q)
    {
        if (IsEmpty(Q))
            Error("Empty queue");
        else
        {
            Q->Size--;
            Q->Front = Succ(Q->Front, Q);
        }
    }
    
    ElementType FrontAndDequeue(Queue Q)
    {
        ElementType X = 0;
    
        if (IsEmpty(Q))
            Error("Empty queue");
        else
        {
            Q->Size--;
            X = Q->Array[Q->Front];
            Q->Front = Succ(Q->Front, Q);
        }
        return X;
    }
    

    testqueuear.c

    #include <stdio.h>
    #include "queuear.h"
    
    int main( )
    {
        Queue Q;
        int i;
    
        Q = CreateQueue( 12 );
    
        for( i = 0; i < 10; i++ )
            Enqueue( i, Q );
    
        while( !IsEmpty( Q ) )
        {
            printf( "%d
    ", Front( Q ) );
            Dequeue( Q );
        }
        for( i = 0; i < 10; i++ )
            Enqueue( i, Q );
    
        while( !IsEmpty( Q ) )
        {
            printf( "%d
    ", Front( Q ) );
            Dequeue( Q );
        }
    
        DisposeQueue( Q );
        return 0;
    }
    
  • 相关阅读:
    FreeRTOS之源码 及 移植详解
    FreeRTOS之Tracealyzer for FreeRTOS(FreeRTOS+Trace) 详解(源码解析+移植)
    FreeRTOS之全配置项详解、裁剪(FreeRTOSConfig.h)
    linux下安装oracle中遇到的一些问题
    RedHat Enterprise Linux 6 配置Xmanager ,实现图形界面连接
    Linux ext2/ext3文件系统详解
    对固态硬盘ssd进行4k对齐
    在CentOs6.5安装jdk
    Android的API版本和名称对应关系
    Java反射机制及Method.invoke详解
  • 原文地址:https://www.cnblogs.com/typewriter/p/6213461.html
Copyright © 2011-2022 走看看