資料結構之佇列

2021-07-11 07:16:45 字數 4033 閱讀 6121

標籤(空格分隔): 資料結構

佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。

是一種先進先出(fifo—first in first out)線性表。

2.1.1 順序佇列的概念

建立順序佇列結構必須為其靜態分配或動態申請一片連續的儲存空間,並設定兩個指標進行管理。乙個是隊頭指標front,它指向隊頭元素;另乙個是隊尾指標rear,它指向下乙個入隊元素的儲存位置。

每次在隊尾插入乙個元素是,rear增1;每次哎隊頭刪除乙個元素時,front增1。隨著插入和刪除操作的進行,佇列元素的個數不斷變化,佇列所佔的儲存空間也在為佇列結構所分配的連續空間中移動。當front=rear時,佇列中沒有任何元素,稱為空佇列。當rear增加到指向分配的連續空間之外時,佇列無法再插入新元素,但這時往往還有大量可用空間未被占用,這些空間是已經出隊的佇列元素曾經占用過得儲存單元。

順序佇列中的溢位現象:

(1) 「下溢」現象:當隊列為空時,做出隊運算產生的溢位現象。「下溢」是正常現象,常用作程式控制轉移的條件。

(2)」真上溢」現象:當佇列滿時,做進棧運算產生空間溢位的現象。「真上溢」是一種出錯狀態,應設法避免。

(3)」假上溢」現象:由於入隊和出隊操作中,頭尾指標只增加不減小,致使被刪元素的空間永遠無法重新利用。當佇列中實際的元素個數遠遠小於向量空間的規模時,也可能由於尾指標已超越向量空間的上界而不能做入隊操作。該現象稱為」假上溢」現象。

參照:2.1.2順序佇列的c語言實現

佇列有下面幾個操作:

順序佇列的陣列實現

#ifndef _queue_h

#define _queue_h

#ifdef __cplusplus

extern "c"queue;

queue* creatqueue(int max_elements);

bool isqueueempty(queue* q);

bool isqueuefull(queue* q);

void enqueue(queue* q, elementtype val);

elementtype dequeue(queue* q);

void distroyqueue(queue* q);

#ifdef __cplusplus

}#endif

#endif

#include"queue.h"

#include

#include

queue* creatqueue(int max_elements)

q->array = (elementtype*)malloc(sizeof(elementtype)*max_elements);

if (q->array == null)

q->capacity = max_elements;

q->front = 0;

q->rear = 0;

return q;

}bool isqueueempty(queue* q)

bool isqueuefull(queue* q)

void enqueue(queue* q, elementtype val)

q->array[q->rear] = val;

q->rear++;

}elementtype dequeue(queue* q)

q->front++;

return q->array[q->front - 1];

}void distroyqueue(queue* q)

}

// test.cpp : 定義控制台應用程式的入口點。

//#include"queue.h"

#include

int main()

2.2.1 概念

在實際使用佇列時,為了使佇列空間能重複使用,往往對佇列的使用方法稍加改進:無論插入或刪除,一旦rear指標增1或front指標增1 時超出了所分配的佇列空間,就讓它指向這片連續空間的起始位置。自己真從maxsize-1增1變到0,可用取餘運算rear%maxsize和front%maxsize來實現。這實際上是把佇列空間想象成乙個環形空間,環形空間中的儲存單元迴圈使用,用這種方法管理的佇列也就稱為迴圈佇列。處了一些簡單應用之外,真正實用的佇列時迴圈佇列。

在迴圈佇列中,當隊列為空時,有front=rear,而當所有佇列空間全佔滿時,也有front=rear。為了區別這兩種情況,規定迴圈佇列最多只能有maxsize-1個佇列元素,當迴圈佇列中只剩下乙個空儲存單元時,佇列就已經滿了。因此,佇列判空的條件時front=rear,而佇列判滿的條件時front=(rear+1)%maxsize

2.2.2 迴圈佇列的c語言實現

#ifndef _queue_h

#define _queue_h

#ifdef __cplusplus

extern "c"listnode;

typedef struct tagqueue

queue;

queue* creatqueue();

bool isqueueempty(queue* q);

void enqueue(queue* q, elementtype val);

elementtype front(queue* q);

void dequeue(queue* q);

void distroyqueue(queue* q);

#ifdef __cplusplus

}#endif

#endif

#include

"queue.h"

#include

#include

#define fatalerror(str) fprintf(stderr,"%s\n",str),exit(1)

queue

* creatqueue()//建立乙個空佇列

bool isqueueempty(queue

* q)

void enqueue(queue

* q, elementtype val)

void dequeue(queue

* q)

elementtype front(queue

* q)

void distroyqueue(queue

* q)

}`此處輸入**`

// huawei_test.cpp : 定義控制台應用程式的入口點。

//#include"queue.h"

#include

int main()

queue

queue模板類的定義在標頭檔案中。

與stack模板類很相似,queue模板類也需要兩個模板引數,乙個是元素型別,乙個容器型別,元素型別是必要的,容器型別是可選的,預設為deque型別。

定義queue物件的示例**如下:

queue q1;

queue q2;

queue的基本操作有:

入隊,如例:q.push(x); 將x接到佇列的末端。

出隊,如例:q.pop(); 彈出佇列的第乙個元素,注意,並不會返回被彈出元素的值。

訪問隊首元素,如例:q.front(),即最早被壓入佇列的元素。

訪問隊尾元素,如例:q.back(),即最後被壓入佇列的元素。

判斷佇列空,如例:q.empty(),當佇列空時,返回true。

訪問佇列中的元素個數,如例:q.size()

普通的佇列是一種先進先出的資料結構,元素在佇列尾追加,而從佇列頭刪除。在優先佇列中,元素被賦予優先順序。當訪問元素時,具有最高優先順序的元素最先刪除。優先佇列具有最高端先出 (largest-in,first-out)的行為特徵。

待續…參考:

1.

資料結構之佇列

八 佇列 鏈式佇列 鍊錶實現 隊尾 rear 隊首 front 靜態佇列 陣列實現 必須是迴圈佇列 需要幾個引數來確定,各引數含義 1 佇列初始化 front和rear值都是0 2 佇列非空 front代表佇列第乙個元素 rear代表佇列最後乙個元素的 下乙個元素 3 佇列空 front和rear相...

資料結構之佇列

與棧相反,佇列是一種先進先出的線性表,它只允許在表的一端進行,而在另一端刪除元 素。在佇列中,允許插入的一端叫做隊尾,允許刪除的一端則稱為隊頭。1 鏈佇列 佇列的鏈式表示和實現 用鍊錶表示的佇列簡稱為鏈佇列,乙個鏈佇列顯然需要兩個分別指示對頭和隊尾的指標 分別稱為頭指 針和尾指標 才能唯一確定。這裡...

資料結構之佇列

一 佇列的介紹 佇列 queue 是一種線性儲存結構。它有以下幾個特點 1 佇列中資料是按照 先進先出 fifo,first in first out 方式進出佇列的。2 佇列只允許在 隊首 進行刪除操作,而在 隊尾 進行插入操作。佇列通常包括的兩種操作 入佇列 和 出佇列。1.佇列的示意圖 佇列中...