佇列(queue)是一種限定訪問位置的線性變。他允許在表的一端插入,在另一端刪除。這個和計算機排程策略中的先來先服務fcfs(first come/first served)是一樣的。佇列中可以插入的一端為隊尾(rear),允許刪除的一端稱為隊頭(front)。
佇列也分為兩種,一種是用陣列的儲存表示,一種是基於鍊錶的儲存表示。
基於陣列的儲存表示的佇列被稱為順序佇列。其資料成員包括,一維陣列elements用來儲存資料,指標front和rear用來指示隊尾隊頭的位置,maxsize是陣列的最大長度。
從上邊的圖可以看出來,rear指標到指到陣列最後一位時就不能繼續往後新增元素,如果之前刪除過元素,front指標前還有空閒的空間未被使用,造成空間的浪費。所以,使佇列迴圈起來就可以使其最大限度的利用空間。
變成迴圈佇列,為了避免越界,每次新增新元素時,尾指標需要加一後對堆長取餘
即 rear = (rear+1)%maxsize;
刪除元素也一樣
front = (front+1)%maxsize;
為了區別於空佇列,用(rear+1)%maxsize==front來判斷是否隊滿,即隊尾走到隊頭前乙個位置即判定隊滿。再因為隊尾所指的空間為最後乙個元素的下乙個位置,所以迴圈佇列最多能存放maxsize-1個元素。
#ifndef _queue_h#define _queue_h
#includeusing namespace std;
const int maxsize = 50;
templateclass queue
; ~queue(){};
virtual bool enqueue(const t& x) = 0;
virtual bool dequeue(t& x) = 0;
virtual bool getfront(t& x) = 0;
virtual bool isempty()const = 0;
virtual bool isfull()const = 0;
virtual int getsize()const = 0;
};#endif
#include#include"queue.h"執行結果templateclass seqqueue;
templateostream& operator<< (ostream& out, seqqueue& q)//將友元函式宣告在前可以避免其警告友元函式未宣告
//析構函式
bool enqueue(const t& x);//入佇列
bool dequeue(t& x);//出佇列
bool getfront(t& x);//找隊頭
bool isempty()const//判空
bool isfull()const//判滿
int getsize()const//得隊長
friend ostream& operator<<<>(ostream& out, seqqueue& q);
//void print();
};/*templatevoid seqqueue::print()
}}*/
templatebool seqqueue::enqueue(const t& x)
return false;
}templatebool seqqueue::dequeue(t& x)
return false;
}templatebool seqqueue::getfront(t& x)
return false;
}templateseqqueue::seqqueue(int sz):front(0),rear(0),maxsize(sz)
int main()
{ seqqueueq(7);
for(int i=7; i>0; --i)
q.enqueue(i);
cout<=0; --i)
q.dequeue(q);
cout<
迴圈佇列 順序佇列
在前兩篇中講述了順序佇列中的隊頭移動與不移動兩種順序佇列,今天討論順序佇列中的迴圈佇列,這種迴圈佇列是用一維陣列實現的。在隊頭移動的情況下,根據元素個數與佇列容量之間的數量關係來解決假溢位問題。從上圖中我們可以理解為什麼這種佇列結構可以解決假溢位問題,但是隨之而來,我們要如何判定迴圈佇列已滿呢?在此...
佇列 順序迴圈佇列
順序佇列 sequence queue 用一片連續的儲存空間來儲存佇列中的資料元素.用一維陣列來存放順序佇列中的資料元素。隊頭位置設在陣列下標為 0 的端,用 front 表示 隊尾位置設在陣列的另一端,用 rear 表示。front 和 rear 隨著插入和刪除而變化。當隊列為空時,front r...
C 迴圈順序佇列
顧名思義 採用順序結構存放的佇列稱為順序佇列 迴圈順序佇列可以避免佇列的假溢位現象的發生。如下圖示,迴圈佇列的幾種特殊情況。學習完順序迴圈佇列個人感覺應該注意的事項 front rear只是表示在base i 這個順序表中的索引值,而不是記憶體的絕對位址,這樣也才在後面的迴圈的時候處理起來比較方便 ...