棧和佇列 佇列

2021-06-22 03:51:06 字數 4196 閱讀 6294

佇列

,又一種特殊的線性表

佇列(queue)是只允許在一端進行插入,而在另一端進行刪除的運算受限的線性表

允許刪除的一端稱為隊頭(front)。

允許插入的一端稱為隊尾(rear)。

當佇列中沒有元素時稱為空佇列。

佇列的修改是依先進先出的原則進行的。

新來的成員總是加入隊尾(即不允許"加塞"),每次離開的成員總是佇列頭上的(不允許中途離隊),即當前"最老的"成員離隊。

置空隊。構造乙個空佇列q。

(2)queueempty(q)

判隊空。若佇列q為空,則返回真值,否則返回假值。

(3) queuefull(q)

判隊滿。若佇列q為滿,則返回真值,否則返回假值。

注意:此操作只適用於佇列的順序儲存結構。

(4) enqueue(q,x)

若佇列q非滿,則將元素x插入q的隊尾。此操作簡稱

入隊。(5) dequeue(q)

若佇列q非空,則刪去q的隊頭元素,並返回該元素。此操作簡稱

出隊。(6) queuefront(q)

若佇列q非空,則返回隊頭元素,但不改變佇列q的狀態。

(1)定義 

佇列的順序儲存結構稱為順序佇列,順序佇列實際上是運算受限的順序表。

需要兩個變數front 、rear 分別指示佇列頭元素 和 佇列尾元素的位置!

(2) 基本操作

入隊:將新元素插入 rear 所指的位置,然後將rear加1。

出隊:刪去front所指的元素,然後將front加1並返回被刪元素。

注意:front = rear 時,隊列為空

在非空佇列裡,隊頭指標始終指向隊頭元素,尾指標始終指向隊尾元素的下一位置。

(3)溢位現象

"下溢"現象:

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

"真上溢"現象:

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

"假上溢"現象:

由於入隊和出隊操作中,頭尾指標只增加不減小,致使被刪元素的空間永遠無法重新利用。當佇列中實際的元素個數遠遠小於向量空間的規模時,也可能由於尾指標已超越向量空間的上界而不能做入隊操作。該現象稱為"假上溢"現象。為了解決這個問題,我們可以使用『迴圈佇列』。(所以很多情況下,我們不會使用普通的順序表)

為了克服順序佇列的 "假上溢"現象,將向量空間想象為乙個首尾相接的圓環,並稱這種向量為迴圈向量。儲存在其中的佇列稱為迴圈佇列(circular queue)。

(1)  迴圈佇列的型別定義

#define maxqsize 100   //應根據具體情況定義該值

typedef char qelemtype; //qelemtype的型別依賴於具體的應用

typedef struct

cirqueue;

(2)迴圈佇列的基本操作

跟普通順序表一樣,迴圈佇列中進行出隊、入隊操作時,頭尾指標仍要加1,朝前移動。

只不過當頭尾指標指向向量上界(maxqsize-1)時,其加1操作的結果是指向向量的下界0。

這種迴圈意義下的加1操作可以描述為:

方法一:

if(i+1 == maxqsize) // i 表示front或rear

i=0;

else

i++;

方法二:利用"模運算"

i = (i+1) % maxqsize;
(3) 迴圈佇列邊界條件處理

迴圈佇列中,由於入隊時尾指標向前追趕頭指標;出隊時頭指標向前追趕尾指標,造成隊空和隊滿時頭尾指標均相等。因此,無法通過條件front==rear來判別佇列是"空"還是"滿"。 【

參見動畫演示】

解決這個問題的方法至少有三種:

另設一布林變數以區別佇列的空和滿;

少用乙個元素的空間。約定入隊前,測試尾指標在迴圈意義下加1後是否等於頭指標,若相等則認為隊滿(注意:rear所指的單元始終為空);

使用乙個計數器記錄佇列中元素的總數(即佇列長度)。

(4) 迴圈佇列的基本運算(我們使用第二種方法)

構造空佇列

bool initqueue(cirqueue * q)

判隊空

bool queueempty(cirqueue * q)

else

return false;

}

判隊滿

bool queuefull(cirqueue * q)

else

return false;

}

入隊

bool enqueue(cirqueue * q, qelemtype e)

q->base[q->rear] = e; //插入元素

q->rear = (q->rear + 1) % maxqsize; //修改尾指標

return true;

}

出隊

bool dequeue(cirqueue * q, qelemtype * e)

*e = q->base[q->front]; //返回元素值

q->front = (q->front + 1) % maxqsize; //修改頭指標

}

(1)鏈佇列的定義

佇列的鏈式儲存結構簡稱為鏈佇列。它是限制僅在表頭刪除和表尾插入的單鏈表。

注意:

有乙個頭結點!

(2)鏈佇列的型別定義

typedef struct qnode

qnode, *queueptr;

typedef struct

linkqueue;

(3)鏈佇列的基本運算

構造空隊

bool initqueue(linkqueue * q)

q->front->next = null; //初始化空佇列

return true;

}

銷毀佇列

bool destroyqueue(linkqueue * q)

return true;

}

入隊

bool enqueue(linkqueue * q, qelemtype e)

p->data = e; //初始化新結點

p->next = null;

q->rear->next = p; //修改尾指標

q->rear = p;

return true;

}

出隊

bool dequeue(linkqueue * q, qelemtype * e)

queueptr p = q->front->next; //儲存第乙個結點的位置

*e = p->data;

q->front->next = p->next; //第乙個結點出隊

if (q->rear == p)

free(p);

return true;

}

注意:

和鏈棧類似,無須考慮判隊滿的運算及上溢。

在出隊演算法中,一般只需修改隊頭指標。但當原隊中只有乙個結點時,該結點既是隊頭也是隊尾,故刪去此結點時亦需修改尾指標,且刪去此結點後佇列變空。

棧和佇列(佇列)

列隊類 public class myqueue 帶引數構造方法,引數為陣列大小 public myqueue int maxsize 新增資料 從隊尾插入 public void insert int value arr end value 注意是 end 不是end element 刪除資料,從...

棧的佇列(佇列)

二.關於佇列的簡單實現。順序佇列的基本實現和順序棧的實現基本相似。順序佇列在出列和入列的時候會使佇列整體向上移動,會浪費一定的空間。因此出現了一種佇列叫做迴圈佇列。迴圈佇列可以實現空間的重複利用,大大節省了空間。關於迴圈佇列的實現 建立乙個空佇列 struct node struct node in...

STL 優先佇列,佇列,棧

stl中優先佇列的使用方法 priority queue 基本操作 empty 如果隊列為空返回真 pop 刪除隊頂元素 push 加入乙個元素 size 返回優先佇列中擁有的元素個數 top 返回優先佇列隊頂元素 在預設的優先佇列中,優先順序高的先出隊。在預設的int型中先出隊的為較大的數。使用方...