1、隊列的定義
隊列是一種先進先出(FIFO)的線性表,它只允許在表的一端進行插入,而在另一端刪除元素。這和我們日常生活中排隊是一樣的,最早進入隊列的元素最早離開。
在隊列中,允許插入的一端叫做隊尾(rear),允許刪除的一端則稱爲隊頭(front)。
2、隊列的基本操作
3、隊列的分類
隊列包含兩種形式:鏈隊列和順序隊列。
3.1、鏈隊列
用鏈表表示的隊列簡稱爲鏈隊列。一個鏈隊列包含兩個分別指向隊頭和隊尾的指針(分別成爲頭指針和尾指針)。
3.1.1 單鏈隊列的定義:
//隊列的鏈式存儲結構
typedef struct QNode{
QElemType data;
struct QNode *next;
}Qnode,*Queneptr;
typedef struct{
Queneptr front;//隊頭指針
Queneptr rear;//隊尾指針
}LinkQuene;
3.1.2 基本操作
約定:
隊空:s.front=s.rear(有頭結點)
s.front=NULL(無頭結點)
鏈隊無隊滿的情況(假定內存足夠大)
(1)構造一個空隊列
Status init_quene(LinkQuene &s)
{
s.front=(Queneptr *)malloc(sizeof(Qnode));
if(!s.front)
exit(OVERFLOW);
s.rear=s.front;
s.front->next=NULL;
return OK;
}
(2)銷燬隊列
Status destory_quene(LinkQuene &s,QElemType &e)
{
while(s.front)
{
s.rear = s.front->next;
free(s.front);
s.front = s.rear;
}
retrun OK;
}
(3)入隊
//插入元素e爲S的新的隊尾元素
Status en_quene(LinkQuene &s,QElemType e)
{
Queneptr p=(Queneptr *)malloc(sizeof(Qnode));
if(!p)
exit(OVERFLOW);
p->data=e;
p->next=NULL;
s.rear->next=p;
s.rear=p;
return OK;
}
(4)出隊
Status de_quene(LinkQuene &s,QElemType &e)
{
if(s.rear == s.front)
{
retuen ERROR;
}
Queneptr p=s.front->next;
e=p->data;
s.front->next=p->next;
if(s.rear==p)
s.rear=s.front;
free(p);
return OK;
}
3.2、順序隊列
在隊列的順序存儲結構中,除了用一組地址連續的存儲單元依次存放從隊列頭到隊列尾的元素之外,尚需附設兩個指針 front和 rear 分別指示隊列頭元素及隊列尾元素的位置。
3.2.1 順序隊列的定義
#define MAXQSIZE 100 //最大隊列長度
typedef struct
{
QelemType *base; //初始化的動態分配存儲空間
int front; //頭指針,若隊列不空,指向隊列頭元素
int rear; //尾指針,若隊列不空,指向隊列尾元素的下一個位置
}squene;
約定:
空隊列 :Q.front=Q.rear
隊滿 :Q.front=(Q.rear+1)%MAXSIZE
入隊: Q.rear++
出隊: Q.front++
非空隊列:front始終指向隊頭元素,rear始終指向隊尾元素的下一位置
每插入一個元素,rear=(rear+1)%(MAXSIZE)
每刪除一個元素,front=(front+1)%(MAXSIZE)
3.2.2 順序隊列的基本操作
(1)構造一個空隊列
Status init_quene(squene &s)
{
s.base=(QelemType *)malloc(sizeof(QelemType));
if(!s.base)
exit(OVERFLOW); //存儲分配失敗
s.front = s.rear =0;
return OK;
}
(2)求隊列的元素個數,即隊列的長度
int queue_length(squene s)
{
//return (s.rear-s.front+1) % MAXSIZE;
return (s.rear-s.front+MAXSIZE) % MAXSIZE;
}
(3)入隊
//插入元素e 爲隊列 s 的新的隊尾元素
Status en_quene(squene &s,QelemType e)
{
if(((s.rear+1) % MAXSIZE) == s.front)
{
return ERROR;
}
s.base[s.rear] = e;
s.rear = (s.rear+1) % MAXSIZE;
return OK;
}
(4)出隊
Status de_quene(squene &s,QelemType e)
{
//若隊列不空,則刪除 s 的的隊頭元素,用 e 返回其值,並返回 OK
if(s.rear==s.front)
{
return ERROR;
}
e = s.base[s.front];
s.front = (s.front+1) % MAXSIZE;
}