C資料結構-優化順序佇列
阿新 • • 發佈:2018-12-21
優化順序佇列
如果直接複用之前的順序表,那麼在佇列的入隊和出隊操作裡,勢必會有一個操作的時間複雜度是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; }