佇列:限定一端插入、另一端刪除的線性表。
空隊:佇列中沒有元素時
隊頭(front):允許刪除的一端
隊尾(rear) :允許插入的一端
ps:在佇列中依次加入元素a1,a2,…,an之後,a1是隊頭元素,an是隊尾元素。退出佇列的次序只能是a1,a2,…,an。
1)初始化initiate(q):構造乙個空佇列q。
2)判隊空empty(q):若佇列q空,返回1,否則返回0。
3)入隊enqueue(q, x):在隊尾插入元素x,x 成為新的隊尾
4)出隊dequeue (q):將隊頭元素刪除,並返 回該元素。
5)取隊頭gethead(q):取隊頭元素,但不 刪除它。
順序佇列:佇列的順序儲存結構。
1.用陣列來實現。
2. 隊頭、隊尾都變化,需要兩個指標分別指示隊頭和隊尾當前位置,front:隊頭指標,rear:隊尾指標。
3. 約定:隊頭指標指
向隊頭前一位置,尾指標指向隊尾。
1.當隊滿時再入隊必定產生空間溢位,簡稱「上溢」;上溢是一種出錯狀態,應該設法避免。
2.當隊空時再出隊也將產生溢位,簡稱「下溢」;下溢則可能是正常現象,因為佇列初態或終態都是空,下溢常作程式控制轉移的條件。
3.佇列並不滿,若尾指標已到陣列上界,再入隊也會溢位,稱為「假上溢」。
4.假溢位:當元素被插入到陣列中下標最大的位置上之後,佇列的空間就用盡了,儘管此時陣列的低端還有空閒空間,這種現象叫做假溢位。
5.出隊後原隊頭元素仍存在,但不作有效隊元素,可直接覆蓋。
迴圈佇列:將儲存佇列的陣列頭尾相接;設想向量空間是乙個首尾相接的圓環,稱為迴圈向量,其中的佇列稱為迴圈佇列(circular queue)。
1.空隊時:front=rear;
2.入隊時尾指標向前追趕頭指標:
3.出隊時頭指標向前追趕尾指標,
4.隊滿時:front=rear。
如何判斷隊滿隊空?方法:
1)另設長度計數器n:入隊n++,出隊n--,當n為0時隊空,n為maxsize時隊滿。
2)另設標誌位flag以區分隊空、隊滿:若入隊後出現rear=front,則置flag=1,表明隊滿;其他情況flag=0.
3)空置一單元法:當迴圈響亮中只剩下1個元素空間,即已經存放maxsiza-1個元素時,就認為隊滿。
即隊滿條件為:
ront=(rear+1)%maxsize; 隊空條件為:
rear=front
此時少用乙個儲存單元,且front所指處總為空。
typedef int datatype; //佇列元素型別,假設為整型
const int maxsize=100; //佇列容量
typedef struct sqqueue;
//初始化
void init_sqqueue(sqqueue *sq)
//判空
int empty_sqqueue(sqqueue *sq)
//取佇列
int gethead_sqqueue(sqqueue *sq,datatype *x) else //頭指標的下乙個位置才是隊頭
}//入隊
int en_sqqueue(sqqueue *sq,datatype x) //上溢
else
}//出隊
int de_sqqueue(sqqueue *sq,datatype *x) //下溢
else
}
鏈佇列:佇列的鏈式儲存結構,運算受限的單鏈表。
1.尾插法,取鍊錶的頭部作隊頭,尾部作隊尾。
2.佇列沒有元素移動問題,鏈式儲存是為了動態利用儲存空間。
3.為運算方便,增加頭結點。
typedef struct node * pointer; //結點指標型別
struct node ;
typedef struct lkqueue;
//初始化
void init_lkqueue(lkqueue *lq)
//判空
int empty_lkqueue(lkqueue *lq)
//取隊頭
int gethead_lkqueue(lkqueue *lq,datatype *x)
else
}//入隊
void en_lkqueue(lkqueue *lq,datatype x)
//出隊
int de_lkqueue(lkqueue *lq,datatype *x) //下溢
else
}//等效出隊:
int de_lkqueue2(lkqueue *lq,datatype *x) //下溢
時間效能:
迴圈佇列和鏈佇列的基本操作都需要常數時間o (1)。
空間效能:
迴圈佇列:必須預先確定乙個固定的長度,所以有儲存元素個數的限制和空間浪費的問題。
鏈佇列:沒有佇列滿的問題,只有當記憶體沒有可用空間時才會出現佇列滿,但是每個元素都需要乙個指標域,從而產生了結構性開銷。
資料結構(C 3 2佇列
1.只允許在一端進行插入操作,在另一端進行刪除操作的線性表 2.隊尾 允許插入 入隊 進隊 的一端 3.隊頭 允許刪除 出隊 的一端 4.特性 先進先出 5.例子 銀行排隊 鍵盤緩衝區 作業系統的作業排程 1.設定隊頭 隊尾變數 rear front 2.入隊rear 1 出隊rear 1 3.約定...
資料結構5 佇列
5.1簡介 佇列 queue 和堆疊一樣是一種有序鍊錶,屬於抽象資料型別。不同在於是先進先出 first in,first out,fifo 堆疊只需要乙個top指標指向堆疊頂端即可,但是佇列必須使用front和rear兩個指標分別指向佇列的前端和尾端。基本操作 1 create 建立空佇列 2 a...
資料結構(二) 佇列
一 佇列定義 佇列是限定在一端進行插入,另一端進行刪除特殊線性表。二 佇列基本操作 入隊出隊 三 佇列例題 1.例1 舞伴配對問題 分析 這一題是一道經典的取模運算,每一次將編號往前加一位,到達n就取模。include include include include int main return ...