zoukankan      html  css  js  c++  java
  • 队列————数组实现

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

    下面的实现例程是循环队列,主要增加了一个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!
    ");
        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!
    ");
        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!
    ");
        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!
    ");
            return 0;
        }
    }

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

  • 相关阅读:
    VS2017+MPI10.0安装与环境配置
    数组翻转(非reverse)
    判断一个字符串中出现次数最多的字符,统计这个次数
    Mock模拟数据,前后端分离
    js放大镜
    360度全景图片
    照片墙应用
    KindEditor配置和使用
    关于IIS的错误 312 (net::ERR_UNSAFE_PORT):未知错误
    从C到C++:命令行参数
  • 原文地址:https://www.cnblogs.com/Crel-Devi/p/9600940.html
Copyright © 2011-2022 走看看