• 顺序队列总结


    基本数据结构之-顺序队列

    顺序队列就是对开辟在堆上的一段连续空间的操作

    队列有入队和出队的操作,如果把开始的位置作为队头,那么在入队的时候需要移动数据,如果把末尾做为队头,在出队的时候需要移动元素,所以使用哪种方法都没有简单的,

    其实可以指定两个参数来标记队列中队头和对尾的位置,但是在入队和出队的时候就需把这种情况考虑进去。(其实这就成了循环队列了,哈哈)

    今天还是写顺序队列吧

    //分析需要一个容量(因为需要动态的开辟空间来存储数据)

    // 需要一个长度来记录当前数据的长度

    typedef struct _ORDERQUEUE

    {

        // 数据

        void ** Data;

       

        // 数据长度

        int Size;

     

        // 数据容量

        int Capacity;

    }OrderQueue;

    初始化,

    // 初始化

    int Init_OrderQueue(void **orderqueue, int capacity)

    {

        if (orderqueue == NULL)

        {

            exit(-1);

        }

        // 将数据转化为我们可以操作的类型

        OrderQueue **queue = (OrderQueue **)orderqueue;

     

        while(*queue == NULL)

        {

            // 保证能开辟空间成功

            *queue = (OrderQueue *)malloc(sizeof(OrderQueue));

        }

        // 开辟数据区的容量

        (*queue)->Data = (void **)malloc(sizeof(void *)*capacity);

        memset((*queue)->Data, 0, sizeof(void *)*capacity);

     

        if ((*queue)->Data ==NULL)

        {

            exit(-2);

        }

     

        (*queue)->Capacity = capacity;

        (*queue)->Size = 0;

     

        return 0;

    }

    // 入队

    int Push_OrderQueue(void *orderqueue, void *data)

    {

        if (orderqueue == NULL)

        {

            return -1;

        }

        if (data == NULL)

        {

            return -2;

        }

     

        // 将数据转化为我们可以操作的类型

        OrderQueue *queue = (OrderQueue *)orderqueue;

       

        // 当容量和长度相同时,需要开辟其他的空间

        if (queue->Size==queue->Capacity)

        {

            queue->Capacity *= 2;

        // 重新开辟一段空间来存数据

            void ** newQueue = (void **)malloc(sizeof(void *)*queue->Capacity);

            if (newQueue == NULL)

            {

                return -3;

            }

     

            // 将新开辟的空间置零

            memset(newQueue, 0, sizeof(void *)*queue->Capacity);

           

            // 将原来的数据拷贝到现在的空间来

            memcpy(newQueue, queue->Data, sizeof(void *)*queue->Size);

           

            // 释放原来的空间

            free(queue->Data);

           

            // 将数据指针指向新空间

            queue->Data = newQueue;

        }

        // 将数据插入到队列中

        queue->Data[queue->Size] = data;

        ++queue->Size;

        return 0;

     

    }

     

    // 出队

    int Pop_OrderQueue(void *orderqueue)

    {

        if (orderqueue == NULL)

        {

            return -1;

        }

     

        // 将数据转化为我们可以操作的类型

        OrderQueue *queue = (OrderQueue *)orderqueue;

     

        if (queue->Size == 0)

        {

            return -2;

        }

        // 当队列不为空时,出队

        for (int i = 0; i < queue->Size - 1; ++i)

        {

            // 将所有的元素向前移动一个位置,避免假溢出

            queue->Data[i] = queue->Data[i + 1];

        }

        queue->Data[queue->Size - 1] = NULL;

        --queue->Size;

     

        return 0;

    }

     

    // 获取队头元素

    void *Back_OrderQueue(void *orderqueue)

    {

        if (orderqueue == NULL)

        {

            return NULL;

        }

     

        // 将数据转化为我们可以操作的类型

        OrderQueue *queue = (OrderQueue *)orderqueue;

        if (queue->Size == 0)

        {

            return NULL;

        }

        return queue->Data[queue->Size - 1];

    }

     

    void *Front_OrderQueue(void *orderqueue)

    {

        if (orderqueue == NULL)

        {

            return NULL;

        }

     

        // 将数据转化为我们可以操作的类型

        OrderQueue *queue = (OrderQueue *)orderqueue;

        return queue->Data[0];

    }

     

    int Destory_OrderQueue(void *orderqueue)

    {

        if (orderqueue == NULL)

        {

            return -1;

        }

     

        // 将数据转化为我们可以操作的类型

        OrderQueue *queue = (OrderQueue *)orderqueue;

       

        if (queue->Data != NULL)

        {

            free(queue->Data);

            queue->Data = NULL;

        }

        free(queue);

     

        return 0;

    }

     

    int Size_OrderQueue(void *orderqueue)

    {

        if (orderqueue == NULL)

        {

            return -1;

        }

        // 将数据转化为我们可以操作的类型

        OrderQueue *queue = (OrderQueue *)orderqueue;

        return queue->Size;

    }

  • 相关阅读:
    用python实现批量替换.doc文件文件内容
    记我是如何通过Security+考试的
    去哪儿笔试羊生羊问题
    CSS作用域问题
    常用的几种清除浮动的方式
    ECE转专业找工作经历-从零电面到facebook offer
    面经-Bloomberg
    题解-Linked List Cycle II
    自我介绍
    解题技巧-发现子结构
  • 原文地址:https://www.cnblogs.com/bkcarlos/p/5930009.html
Copyright © 2020-2023  润新知