前言
一、佇列的定義
二、佇列的順序儲存結構
1.順序佇列的定義
2.迴圈佇列定義
3.迴圈佇列的基本操作
三、佇列的鏈式儲存結構
1.鏈佇列的定義
2.鏈佇列的基本操作
佇列也是一種線性表,其特殊性在於佇列的基本操作是線性表的子集。佇列按「先進先出」的規則進行操作,故稱其為操作受限的線性表。
佇列(queue)是只允許在一端進行插入操作,在另一端進行刪除操作的線性表,簡稱「隊」。
佇列是一種先進先出(first in first out)的線性表,簡稱fifo。
允許插入的一端稱為隊尾(rear),允許刪除的一端稱為隊頭(front)。
向佇列中插入新的資料元素稱為入隊,新入隊的元素就成為了佇列的隊尾元素。
從佇列中刪除隊頭元素稱為出隊,其後繼元素成為新的隊頭元素。
佇列作為一種特殊的線性表,也同樣存在兩種儲存結構:順序儲存結構和鏈式儲存結構,可以分別用陣列和鍊錶來實現佇列。用一組位址連續的儲存單元,依次存放從隊頭到隊尾的資料元素,稱為順序佇列。
需要附設兩個指標:隊頭指標(front)和隊尾指標(rear),分別指向隊頭元素和隊尾元素。
頭尾指標和順序佇列中資料元素之間的關係示意圖:
「假溢位」:如果在插入e的基礎上再插入元素f,將會插入失敗。因為rear==maxsize,尾指標已經達到佇列的最大長度。但實際上佇列儲存空間並未全部被佔滿,這種現象叫做「假溢位」。
假溢位的原因是順序佇列進行隊頭出隊、隊尾入隊,造成陣列前面會出現空閒單元未被充分利用。
為了解決「假溢位」現象,使得佇列的儲存空間得到充分利用,乙個巧妙的方法就是將順序佇列的陣列看成乙個頭尾相接的迴圈結構。佇列的頭尾相接的順序儲存結構稱為迴圈佇列。
問題:當迴圈對列為空或滿時,都是隊尾指標等於隊頭指標,即rear==front 。當rear==front時,該是判滿還是判空呢?
解決方案:
方案一:設定乙個計數器,開始時計數器設為0,新元素入隊時,計數器加1,元素出隊,計數器減1。當計數器==maxsize時,隊滿;計數器==0時,隊空。
方案二:保留乙個元素空間,當隊尾指標指的空閒單元的後繼單元是隊頭元素所在單元時,隊滿。
隊滿的條件為(q.rear+1)%maxsize==q.front;
隊空的條件為q.rear==q.front
typedef int elemtype
#define maxsize 1024
/*迴圈佇列的順序儲存結構*/
typedef struct
sqqueue;
/*初始化乙個空佇列*/
int init_sequeue(sequeue *q)
return 1;
}/*求佇列長度*/
int queuelength(sequeue *q)
/*判空*/
int sequeue_empty(sequeue *q)
/*判滿*/
int sequeue_full(sequeue *q)
/*入隊操作*/
int enter_sequeue(sequeue *q,elemtype e)
q->data[q->rear]=e;
q->rear=(q->rear+1)%maxsize;
return 1;
}/*出隊操作*/
int delete_sequeue(sequeue *q,elemtype e)
e=q->data[q->front];
q->rear=(q->front+1)%maxsize;
return 1;
}
採用鏈式儲存結構實現的佇列稱為鏈佇列。
為了使操作更加方便,將隊頭指標指向鏈佇列的頭結點,而隊尾指標指向終端結點。
空佇列時,front和rear都指向頭結點,即front==rear
鏈佇列結構:
typedef int elemtype
/*結點結構*/
typedef struct qnode
qnode,*queueptr;
/*鏈佇列結構*/
typedef struct
linkqueue;
typedef int elemtype
/*結點結構*/
typedef struct qnode
qnode,*qnodeptr;
/*鏈佇列結構*/
typedef struct
linkqueue,*linkqueueptr;
/*初始化乙個空佇列*/
int init_linkqueue(linkqueueptr q)
return 1;
}/*判空*/
int linkqueue_empty(linkqueueptr q)
/*入隊操作*/
int enter_linkqueue(linkqueueptr q,elemtype e)
//初始化新結點
s->data=e;
s->next=null;
//建立新聯絡
q->rear->next=s;
q->rear=s;
return 1;
}/*出隊操作*/
int delte_linkqueue(linkqueueptr q,elemtype *e)
//保留刪除結點的資訊
p=q->front->next;
*e=p->data;
//建立新聯絡
q->front->next=p->next;
if(q->rear==p)
free(p);
return 1;
}
資料結構 佇列實現(順序迴圈佇列 鏈式佇列)
佇列的介面 public inte ce qqueue 存在假溢位問題!不建議使用 使用模擬迴圈的方式避免假溢位 實現 package pers.zhang.queue author zhang date 2020 1 17 11 45 順序迴圈佇列 public class seqqueue im...
資料結構 佇列 迴圈佇列
在佇列的陣列實現中,我們很容易發現數在出隊後,陣列的前面部分會有剩餘空間沒有被使用,所以我們為了最大程度的利用固定長度的陣列,我們採用迴圈佇列的儲存方式,這種方式的最大問題在於resize的時候比較麻煩,所以我們不考慮resize的情況。基本結構如下,這裡front指向第乙個元素的位置,rear指向...
資料結構 佇列 迴圈佇列
資料結構 佇列 迴圈佇列 順序儲存 犧牲乙個空間單元來判段佇列滿狀態。q.front q.rear 1 initsize date 2017 4 16 include define elemtype char define initsize 100 typedef structsqqueue voi...