佇列
,又一種特殊的線性表
佇列(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型中先出隊的為較大的數。使用方...