1. 程式人生 > >C資料結構-優化順序佇列

C資料結構-優化順序佇列

優化順序佇列

如果直接複用之前的順序表,那麼在佇列的入隊和出隊操作裡,勢必會有一個操作的時間複雜度是O(n),因為發生了陣列元素的挪移操作。下面是優化後的順序佇列,其中使用了一個頭位置和一個尾位置來迴圈的使用陣列空間,以達到入隊和出隊的時間複雜度都是O(1)。
#ifndef OPTSEQQUEUE
#define OPTSEQQUEUE

#ifndef NULL
#define NULL 0
#endif

/* 元素型別 */
typedef int elem_t;

/* 順序表結構體 */
typedef struct
{
    int length;/* 順序表長度 */
    int capacity;/* 順序表的最大容量 */
    int header;/* 頭元素的位置 */
    int tail;/* 尾元素的位置 */
    elem_t data[];

}opt_seq_queue;

/**
 * 優化順序佇列初始化
 * @param capacity
 * @return
 */
opt_seq_queue *opt_seq_queue_init(int capacity);

/**
 * 入隊
 * @param p 佇列指標
 * @return 成功:1,失敗:0
 */
int opt_seq_queue_enqueue(opt_seq_queue *p,elem_t *pe);

/**
 * 出隊
 * @param p 佇列指標
 * @return 返回元素的值
 */
elem_t opt_seq_queue_dequeue(opt_seq_queue *p);

/**
 * 獲取對頭元素的值
 * @param p 佇列指標
 * @return
 */
elem_t opt_seq_queue_header(opt_seq_queue *p);

/**
 * 獲取佇列長度
 * @param p
 * @return
 */
int opt_seq_queue_length(opt_seq_queue *p);

/**
 * 佇列清空
 * @param p
 * @return
 */
int opt_seq_queue_clear(opt_seq_queue *p);

/**
 * 銷燬佇列
 * @param p
 * @return
 */
int opt_seq_queue_destroy(opt_seq_queue *p);

#endif // OPTSEQQUEUE
#include "OptSeqQueue.h"
#include <malloc.h>

/**
 * 優化順序佇列初始化
 * @param capacity
 * @return
 */
opt_seq_queue *opt_seq_queue_init(int capacity)
{
    opt_seq_queue *plist = (opt_seq_queue *)malloc(sizeof(opt_seq_queue) + sizeof(elem_t) * capacity);

    if(plist)
    {
        plist->length = 0;
        plist->capacity = capacity;
        plist->header = 0;
        plist->tail = 0;
    }

    return plist;
}

/**
 * 入隊
 * @param p 佇列指標
 * @return 成功:1,失敗:0
 */
int opt_seq_queue_enqueue(opt_seq_queue *p,elem_t *pe)
{
    int ret = ((p != NULL) && (pe != NULL) && (p->length + 1 <= p->capacity));

    if(ret)
    {
        p->data[p->tail] = *pe;
        p->tail = (p->tail + 1) % p->capacity;
        p->length++;
    }

    return ret;
}

/**
 * 出隊
 * @param p 佇列指標
 * @return 返回元素的值
 */
elem_t opt_seq_queue_dequeue(opt_seq_queue *p)
{
    elem_t temp;
    if((p != NULL) && (p->length > 0))
    {
        temp = p->data[p->header];
        p->header = (p->header + 1) % p->capacity;
        p->length--;
    }

    return temp;
}

/**
 * 獲取對頭元素的值
 * @param p 佇列指標
 * @return
 */
elem_t opt_seq_queue_header(opt_seq_queue *p)
{
    elem_t temp;
    if((p != NULL) && (p->length > 0))
    {
        temp = p->data[p->header];
    }

    return temp;
}

/**
 * 獲取佇列長度
 * @param p
 * @return
 */
int opt_seq_queue_length(opt_seq_queue *p)
{
    int ret = -1;

    if(p != NULL)
    {
        ret = p->length;
    }

    return ret;
}

/**
 * 佇列清空
 * @param p
 * @return
 */
int opt_seq_queue_clear(opt_seq_queue *p)
{
    int ret = (p != NULL);

    if(ret)
    {
        p->length = 0;
        p->header = 0;
        p->tail = 0;
    }

    return ret;
}

/**
 * 銷燬佇列
 * @param p
 * @return
 */
int opt_seq_queue_destroy(opt_seq_queue *p)
{
    int ret = (p != NULL);

    if(ret)
    {
        free(p);
        p = NULL;
    }

    return ret;
}