zoukankan      html  css  js  c++  java
  • 顺序队列总结

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

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

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

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

    今天还是写顺序队列吧

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

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

    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;

    }

  • 相关阅读:
    C# 各种数据类型的最大值和最小值常数
    使用EntityFramework6连接MySql数据库(db first方式)
    apache ignite系列(八):问题汇总
    apache ignite系列(六): 服务网格
    golang实现get和post请求的服务端和客户端
    python+selenium调用chrome打开网址获取内容
    spring-boot集成spark并使用spark-sql
    apache ignite系列(五):分布式计算
    sqoop导oracle数据到hive中并动态分区
    python使用cx_Oracle连接oracle
  • 原文地址:https://www.cnblogs.com/bkcarlos/p/5930009.html
Copyright © 2011-2022 走看看