一.定義
佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。
二.特點
佇列的特點是先進先出。例如排隊付款,先來的人先付款離開,後來的人後付款離開。
三.儲存結構
佇列按儲存結構可分為順序佇列和迴圈佇列
在實現佇列的方式上有數值佇列,鏈隊。
四.基本運算
序號基本運算
(1)初始化佇列:初始條件:隊q 不存在。操作結果:構造了乙個空隊;
(2)入隊操作: 初始條件: 隊q 存在。操作結果: 對已存在的佇列q,插入乙個元素x 到隊尾,隊發生變化;
(3)出隊操作: 初始條件: 隊q 存在且非空,操作結果: 刪除隊首元素,並返回其值,隊發生變化;
(4)讀隊頭元素:初始條件: 隊q 存在且非空,操作結果: 讀隊頭元素,並返回其值,隊不變;
(5)判隊空操作:初始條件: 隊q 存在,操作結果: 若q 為空隊則返回為1,否則返回為0;
五.迴圈佇列的定義與基本操作
在實際使用佇列時,為了使佇列空間能重複使用,往往對佇列的使用方法稍加改進:無論插入或刪除,一旦rear指標增1或front指標增1 時超出了所分配的佇列空間,就讓它指向這片連續空間的起始位置。自己真從maxsize-1增1變到0,可用取餘運算rear%maxsize和front%maxsize來實現。這實際上是把佇列空間想象成乙個環形空間,環形空間中的儲存單元迴圈使用,用這種方法管理的佇列也就稱為迴圈佇列。除了一些簡單應用之外,真正實用的佇列是迴圈佇列。 [2]
在迴圈佇列中,當隊列為空時,有front=rear,而當所有佇列空間全佔滿時,也有front=rear。為了區別這兩種情況,規定迴圈佇列最多只能有maxsize-1個佇列元素,當迴圈佇列中只剩下乙個空儲存單元時,佇列就已經滿了。因此,佇列判空的條件時front=rear,而佇列判滿的條件時front=(rear+1)%maxsize。隊空和隊滿的情況如圖:
迴圈佇列的初始化
dui *
chuang
(dui * p)
2.迴圈佇列的入隊
void
ru(dui * p,
int x)
p->next[p->rear]
=x;//新元素插入隊尾
p->rear=
(p->rear+1)
%maxsize;
//隊尾指標加一
}
3.迴圈佇列的出隊
void
chu(dui * p,
int a)
a=p->next[p->front]
;//儲存隊頭元素
p->front=
(p->front+1)
%maxsize;
//隊頭指標加一
}
4.求迴圈佇列的長度
int
length
(dui * p)
5.取迴圈佇列的隊頭元素
完整**如下:
#include
#include
#define maxsize 100
typedef
struct
dui;
dui *
chuang
(dui * p)
void
ru(dui * p,
int x)
p->next[p->rear]
=x; p->rear=
(p->rear+1)
%maxsize;
}void
chu(dui * p,
int a)
a=p->next[p->front]
; p->front=
(p->front+1)
%maxsize;
}int
length
(dui * p)
inttou
(dui * p)
void
suoyou
(dui * p)
}int
main()
printf
("長度為%d\n"
,length
(p))
;printf
("隊頭元素為%d\n"
,tou
(p))
;printf
("佇列所有元素為");
suoyou
(p);
return0;
}
執行結果
鏈隊定義:所謂佇列的鏈式儲存結構是用乙個線性鍊錶來表示乙個佇列,佇列中每乙個元素對應鍊錶中乙個鏈結點,這樣的佇列簡稱鏈結佇列。具體地說,把線性鍊錶第1個鏈結點的指標定義為隊頭指標front,在鍊錶最後的鏈結點建立指標rear作為隊尾指標,並且限定只能在鏈頭進行刪除操作,在鏈尾進行插入操作,這個線性鍊錶就構成了乙個鏈結佇列。另乙個與順序儲存結構佇列的不同點是,隊頭指標與隊尾指標都是指向實際隊頭元素與隊尾元素所在的鏈結點。
1.鏈隊的初始化
li *ch(
)
2.鏈隊的入隊
入隊函式我在此處,分了一下情況,所以也就導致後面的輸出隊頭元素的函式有所變化,因為第一次入隊,頭指標和尾指標都是空指標,必須要對其操作,要不然輸出隊頭指標時,仍然為空指標,無法繼續進行操作;(個人想法,有錯勿噴)
void
shu(li *p,
char x)
else
}
3.鏈隊的出隊
void
chu(li *p,
char a)
a=s->date;
free
(s);
}
4.取隊頭元素
char
duitou
(li * p)
5.輸出鏈隊所以元素
void
suoyou
(li*p)
}
完整**如下
#include
#include
typedef
struct lian
lian;
typedef
struct
li; li *ch(
)void
shu(li *p,
char x)
else
}void
chu(li *p,
char a)
a=s->date;
free
(s);
}char
duitou
(li * p)
void
suoyou
(li*p)
}int
main()
printf
("隊頭元素為%c\n"
,duitou
(a))
;printf
("鏈隊所有元素為:");
suoyou
(a);
return0;
}
執行結構如圖
本文寫到的鏈隊可能與你在其他地方看到的不同,尤其是在入隊的部分;
佇列 迴圈佇列與鏈隊
2.鏈隊 注意 佇列也是線性表,其特殊性在於有特殊的運算規則。即 隊結構只能在一端進行插入,該操作端稱為隊尾,另一端刪除元素,該操作端稱為隊頭。按照 先進先出 first in first out,fifo 原則處理資料節點。之所以用迴圈對列,就是了為了提高利用率。要不然每刪除乙個元素,對頭就空了乙...
資料結構 03佇列與迴圈佇列
佇列queue,是乙個有序列表,可以用陣列和鍊錶實現 先進先出,如銀行業務辦理 用陣列模擬佇列 隊尾 rear rear會隨著資料的輸入而不斷增加 隊首 front front會隨著資料的輸出而不斷增加 佇列的長度 rear front 1 最大容量 maxsize 注 這張圖有問題,而且,fron...
資料結構實驗3 順序棧 鏈棧 迴圈佇列 鏈隊
3.1 實現順序棧的基本運算 3.2 實現鏈棧基本運算 3.3 實現迴圈佇列的基本運算 3.4 實現鏈佇列的基本運算 3.1順序棧 include include define ok 1 define error 0 define overflow 0 define stack init size ...