ADT(抽象資料型別) 佇列

2021-10-20 19:26:56 字數 2297 閱讀 6636

佇列是先進先出,直接和排隊模擬即可,佇列的實現較堆疊要麻煩一些,比如用靜態陣列來實現佇列,每次移除資料後原來的位置就空起了,使用乙個指標front指向佇列頭部,用另乙個指標rear指向佇列尾部,比如乙個5個元素的陣列,刪除3個元素後,本來陣列還可以繼續存入3個元素,但那3個元素則無法再次利用了。

為此,提出了環陣列的概念:即當尾部下標移出陣列時,就設定為0。front不再是固定的,而是跟隨移除資料往後移動,front 和rear都是動態變化的,新增資料時rear也遞增移動,刪除資料時front向前移動。

real = (real + 1) % queue_size
那如何判斷佇列滿和佇列空呢?我們先來看一下這個過程:

當佇列滿時,頭部指標front指向3,尾部指標指向2:

當刪除4個元素後,front向後移動4個位置,就指向了2,rear還是指向的2:

當把2位置的最後乙個元素刪除後,front再往後移動乙個位置,到了3,而rear還是2。

有沒有發現這個陣列滿時和陣列空時front指標和real指標指向都一樣。

如何判斷這個佇列是滿還是空呢?

1、可以引入乙個變數,記錄佇列元素個數,新增時變數+1,刪除時變數-1,通過這個值來判斷佇列滿還是空。

2、可以預留乙個不能填充資料的位置,讓佇列不能完全填滿,讓佇列滿的時候front和rear指向不同。

一旦front和rear中間隔了乙個元素時就表示佇列滿:

(rear + 2) % queue_size == front
一旦front和rear相鄰就表示隊列為空,由於第一次新增資料rear會+1,所以real必須比front小:

(rear + 1) % (queue_size) == front
#define queue_size 100//佇列長度

#define array_size (queue_size + 1)//陣列長度

typedef int queue_type;

static queue_type queue[array_size];

static size_t front = 1;

static size_t rear = 0;

void insert(queue_type value)

void delete(void)

queue_type head(void)

int is_empty()

int is_full()

int main()

上面的版本完全可以使用malloc動態記憶體來實現creat_queue和destory_queue和其他操作。邏輯和靜態陣列完全一致,這裡就來看一下鍊錶的實現,這更一有實際應用價值,而且鍊錶來實現adt更容易。.

#define true 1

#define false 0

#define nul '\0'

typedef int queue_type;

typedef struct queue queue;

static queue *queue;

static queue *queue_rear;

void create_queue(size_t size)

void destory(void)

}void enqueue(queue_type value) else

}void dequeue (void)

queue *node = queue;

if(queue == queue_rear) else

}queue_type head(void)

int is_empty()

int is_full()

int main()

抽象資料型別(ADT

說到抽象資料型別,那麼就得先提到資料型別 資料型別指的是乙個值的集合以及定義在這個集合上的一組操作 為什麼要有不同的資料型別呢 當我們計算1 1的時候,只需要很小的儲存空間,但是當我們去計算10000 100000的時候,所需要的空間就會大許多,那麼我們為了去區分這些類別的差異,就有了不同的資料型別...

抽象資料型別(ADT

說到抽象資料型別,那麼就得先提到資料型別 資料型別指的是乙個值的集合以及定義在這個集合上的一組操作 為什麼要有不同的資料型別呢 當我們計算1 1的時候,只需要很小的儲存空間,但是當我們去計算10000 100000的時候,所需要的空間就會大許多,那麼我們為了去區分這些類別的差異,就有了不同的資料型別...

抽象資料型別 佇列

佇列模型 1.在表的末端插入元素 入隊 在表的開頭刪除元素 出隊 表的末端又叫隊尾,表的開頭又叫隊頭 佇列實現 1.陣列實現 使用迴圈陣列的方式來實現佇列的插入和刪除,具體實現如下 1.1定義乙個陣列thearray 定義頭部位置front和尾部位置back 1.2入隊在隊尾插入元素,即新元素放到b...