• 队列ADT


    红心队列的数组实现

    /* 队列的类型声明 */ 
    
    
    #ifndef _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    /* _Queue_h */
    
    
    /* Place in implementation file */
    /* Queue implementation is a dynamically allocated array */
    #define MinQueueSize    ( 5 )
    
    struct QueueRecord
    {
        int Capacity;
        int Front;
        int Rear;
        int Size;
        ElementType *Array;
    };
    /* 测试队列是否为空 */
    
    int 
    IsEmpty( Queue Q )
    {
        return Q->Size == 0;
    }
    /* 构造空队列 */
    
    void
    MakeEmpty( Queue Q )
    {
        Q->Size = 0;
        Q->Front = 1;
        Q->Rear = 0;
    }
    /* 给出Q->Front、Q->Rear自增1后的数组下标值 */
    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;
        }
    }
    
    /* 出队 */
    void
    Dequeue( Queue Q )
    {
        if( IsEmpty( Q ) )
            Error( "Empty queue" );
        else
        {
            Q->Size--;
            Q->Front = Succ( Q->Front, Q );
        }
    }
    
    /* 返回队头元素,但不出队 */
    ElementType 
    Front( Queue Q )
    {
        if( IsEmpty( Q ) )
            Error( "Empty queue" );
        else
            return Q->Array[ Q->Front ];
    }
    
    /* 返回队头元素,并且出队 */
    ElementType
    FrontAndDequeue( Queue Q )
    {
        ElementType Tmp;
        
        if( IsEmpty( Q ) )
            Error( "Empyt queue" );
        else
        {
            Tmp = Q->Array[ Q->Front ] ;
            Q->Size--;
            Q->Front = Succ( Q->Front, Q );
            
            return Tmp;
        }
    }
    /* 创建队列 */
    
    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;
    }
    /* 测试队列是否已满 */
    
    int
    IsFull( Queue Q )
    {
        return Q->Size == Q->Capacity;
    }
    /* 释放队列 */
    
    void
    DisposeQueue( Queue Q )
    {
        if( Q != NULL )
        {
            free( Q->Array );
            free( Q );
        }
    }
  • 相关阅读:
    静态资源放置于独立域名之下
    一个程序学习String类的所有常用方法
    Myeclipse的workspace配置文件浅谈
    使用myeclipse自带的tomcat发布web功能怎么访问
    Java陷阱之assert关键字
    Java集合Map接口与Map.Entry学习
    Java中List和ArrayList的区别
    手动命名名字空间打包以及调用
    命令行java -classpath 的使用
    maven 环境变量设置和Java maven工具配置 on windows 7
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3618641.html
Copyright © 2020-2023  润新知