顺序队列总结

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

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

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

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

今天还是写顺序队列吧

 

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

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

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;

}

posted @ 2016-10-04 02:15  bkcarlos  阅读(550)  评论(0编辑  收藏  举报