Uploaded by Linh Bạch

chapter04

advertisement
What is a queue (佇列,排隊) ?
 A queue is a linear list in which data can be inserted at one end, called
the rear (後端), and deleted from the other end, called the front(前端).
 It is a first in – first out (FIFO) restricted data structure.
(先進先出)
A queue is the same as a line (排隊), you would not get into a line (插隊),
you would get into a queue (佇列)
People
queue
People
leave
Data
deleted
Data
Data Structures: A Pseudocode Approach with C
Data
Data
inserted
1
4-1 Queue Operations
This section discusses the four basic queue operations.
• Enqueue (新增)
• Dequeue (刪除)
• Queue Front (前端資料複製輸出)
• Queue Rear (後端資料複製輸出)
• Queue Example
Data Structures: A Pseudocode Approach with C
2
Enqueue
After the data have been inserted into the queue, the new element
becomes the rear.
Data Structures: A Pseudocode Approach with C
3
Dequeue
The data at the front of the queue are returned to the user and removed
from the queue
Data Structures: A Pseudocode Approach with C
4
Queue Front
It returns the data at the front of the queue without changing the contents
of the queue
Data at the front of the queue can be retrieved (檢索)
Data Structures: A Pseudocode Approach with C
5
Queue Rear
It returns the data at the rear of the queue without changing the contents
of the queue
Retrieves the data at the rear of the queue
Data Structures: A Pseudocode Approach with C
6
Queue Example
資料由末端置入,
堆疊上去,成為
新的最後data node
Data insert
Data is inserted
into the queue and
becomes new node
at the rear
rear
Front return and removed
Data
node
Data node at the front of the
queue are returned to the user
and removed from the queue
資料由前端取出後
移除data node
Data Structures: A Pseudocode Approach with C
7
Queue Example
Return data without
changing the contents
Return data without
changing the contents
Front
Data
node
資料由前端取出
不移除data node
Data Structures: A Pseudocode Approach with C
Rear
Data
node
資料由末端取出
不移除data node
8
4-2 Queue Linked List Design
We first discuss the data structure for a queue.
We then develop the eight operations for a queue.
• Data Structure Queue
• Operations of Queue
Data Structures: A Pseudocode Approach with C
9
Data Structure Queue
The queue will have one head node and several data nodes
概念上 queue 包含
多個串聯資料
one head node
(queue head node)
Front pointer
指向 front data node
rear pointer
指向 rear data node
queue data node
queue head node 內的 front pointer 指向 front data node 位置,rear pointer 指向 rear data node 位置
Data Structures: A Pseudocode Approach with C
10
Data Structure Queue
1. Queue Head node
Queue head node stores
two pointers and a count
•
•
•
Front pointer: point to the first data
node in the queue
Rear pointer : point to the last data node
in the queue
count: how many data nodes in the
queue
2. Queue data node
Queue data node stores 1. the user data
and 2. a link field pointing to the next
queue data node
Data Structures: A Pseudocode Approach with C
Front
Rear
pointer
queue head node pointer
count
link field
queue data node
user data
11
Operations of Queue





Create queue
Enqueue
Dequeue
Queuefront
Queuerear
Data Structures: A Pseudocode Approach with C




Empty queue
Full queue
Queue count
Destroy Queue
12
Create queue
All we have to do is (1) allocate memory for queue head node
(2) set the front and rear pointers to null and the count to 0
(1) allocate memory for queue head node
(2) set the front and rear pointers to null and the count to 0
Data Structures: A Pseudocode Approach with C
13
Enqueue (新增)
Case 1: Insert new data node into an empty queue
佇列內部沒有data node情況下新增data node
從 rear 側 置入 data node
1. In the queue head node,
•the front and rear pointers must both point to the new data node
 Front data = rear data
(queue head node 內的 front 與 rear pointer 皆指向 new data node 位置)
•Count =1
2. In queue data nodes,
Data node’s link is null (無下筆資料指向) Front data = rear data
queue head node 內的 front 與 rear pointer
皆指向 new data node 位置
Count = 0
null
null
Count =1
Queue head node
Queue data node
Remind:
newPtr:
副函數指標指向
new data node被配置的位置
null : 無下一筆data node 可指向
No queue data node
One queue data node insert
14
Enqueue (新增)
Case 2: Insert new data node into a queue with data
佇列內部有data node情況下新增data node 從 rear 側 置入 data node
1. In the queue head node,
•The rear pointers point to the new data node
 front pointers 不用動作
•Count + 1
2. In queue data nodes,
•The rear data node’s link points to new data node
•The new rear data node’s link (new data node’s link) is null (無下筆資料指向)
insert new data node  new data node is the rear data node
 only rear pointer acts to point to the new data node
rear pointers point to
the rear data node (new
data node)
Count =2
null : 無下一筆
data node 可指向
Queue head node
Queue data node
new data node insert
new data node is rear
link 指向下一筆資料位置
one queue data node
two queue data node
15
Enqueue (新增)
佇列已滿
資料停止置入
Memory allocation for new data node
dataIn is put in the data field of data node
the link of new data node is set by null
空佇列則設定head node 的front point
指向 new data node
否則 原來的rear data node 的 link 指向 new data node
Count +1
Data Structures: A Pseudocode Approach with C
Head node 的 rear pointer 指向 new data node
16
Dequeue (刪除)
Front data node = rear data node
Case 1: deleting data node in only one item empty of queue
佇列內部僅有1個data node情況下刪除data node 從 front 刪除 data node
1. In the queue head node, 因為front data node 被移除
•Front pointers point to the next data node (指向將被刪除 front data node 的link)
 將被刪除的front data node的 link = null  queue head node 內的 front pointer 自動 = null
• rear pointer set to be null ( 因為只剩下一個data node )
•Count = 0
2. In queue data nodes,
Data node is removed and memory is recycled
指向next node null
指向將被刪除
data的link
Queue head node
null
Count = 0
Data node is removed
and memory is recycled
Queue data node
one queue data node
Data Structures: A Pseudocode Approach with C
One queue data node is deleted
17
Dequeue (刪除)
Case 2: deleting front data node in a queue
佇列內部有多個data node情況下刪除 front data node
1. In the queue head node,
從 front 刪除 data node
因為front data node 被移除
•Front pointers point to the next data node
 rear pointers 不用動作
(指向將被刪除 front data node 的link)
•Count – 1
2. In queue data nodes,
•The front data node is removed and memory is recycled.
Deleting front data node and recycle  the next data node become the front node
 front pointer of head node points the next data node
Count – 1
Front pointer 指向
next data node (指向將
被刪除front node的
link)
Queue head node
Queue data node
Data node is removed
and memory is recycled
two queue data node
Remove one queue data node
18
Dequeue (刪除)
空佇列無法執行刪除 data node
刪除 front data node, 回收記憶體
只剩一個 data node
rear pointer 設為 null
Count -1
Data Structures: A Pseudocode Approach with C
Head node 的 Front point 指向原來
front data node 的 link
 指向下一個data node位置
19
Retrieving Queue Data
QueueFront
It returns the data at the front of
the queue without changing the
contents of the queue
空佇列無資料可取
回傳front data node 出去至 dataOut
Data Structures: A Pseudocode Approach with C
20
Empty Queue
回傳true
Data Structures: A Pseudocode Approach with C
Queue head node 中的count =0  queue 內無data node
空的queue
21
Full Queue
檢查記憶體是否已滿,無法進行queue
回傳true : Memory 已滿
Data Structures: A Pseudocode Approach with C
如果Queue對於data node
無法 allocate memory
22
Queue count
Return the count of Queue head node
回傳queue內有多少data node
Data Structures: A Pseudocode Approach with C
23
Destroy Queue
queue內有data node
queue內有data node
 每次刪除front node, recycle memory
data node 刪除完後,
最後將Queue head node 刪除, recycle meomory
Data Structures: A Pseudocode Approach with C
24
queue head node 內的 front pointer 指向 front data node 位置,rear pointer 指向 rear data node 位置
front pointers = null
rear pointers = null
count set 0
Create queue
allocate memory
for queue head node
front pointers = new data node
rear pointers = new data node
count +1
Enqueue
in no data node
front = rear
無指向下一
筆data node  = null
從 rear 側置
入 data node
Rear pointer
指向 new data node
count +1
Enqueue
in data nodes
Data Structures: A Pseudocode Approach with C
指向 new data node
無指向下一
筆data node  = null
New data
25
queue head node 內的 front pointer 指向 front data node 位置,rear pointer 指向 rear data node 位置
從 front
刪除 data node
Front pointer 指向下一data node
 指向刪除data node的 link
Dequeue
被刪除 data node,
Recycle memory
Destroy
Queue head node removed
and memory recycle
Data node removed
and memory recycle
Data Structures: A Pseudocode Approach with C
26
4-3 Queue ADT
This section develops the data structures and C code to
implement a Queue ADT.
• Queue Structure
• Queue ADT Algorithms
Data Structures: A Pseudocode Approach with C
27
Queue Structure
Queue data node
Queue Head node
宣告成QUEUE_NODE型態的指標,
用來存放QUEUE_NODE資料型態
的資料位置
存放 data位置的指標的位置
Queue
algorithm
Double pointer
Example
單指標變數ptr1存放變數a的位置
雙指標變數 可在呼叫函數內
改變傳入之指標變數內值 (call by reference)
*Ptr1 顯示 10
**Ptr2 顯示 10
雙指標變數ptr2存放單指標變數ptr1的位置
Create Queue
配置memory給queue head node
(*queue).front = null  Front pointer = null
(*queue).rear = null  rear pointer = null
(*queue).count= 0  counter = 0
Data Structures: A Pseudocode Approach with C
29
Enqueue
Queue head node 位置
欲安插資料的位置
配置記憶體給欲新增的node
(*newPtr).dataPtr = itemPtr  new node 的 data 變數放入
欲安插資料的位置
(*newPtr).next = Null
 因為 新增new node 為最後
如果為一開始無節點之新增
data node  next 變數設定null
(*queue).front = newPtr  因為 新增new node 為唯一
Counter + 1
Data Structures: A Pseudocode Approach with C
data node ,front pointer 設為
new node的位置
(*queue).(*rear).next= newPtr
 原來rear data node 則放入
New data node 的位置
(*queue).rear = newPtr
(因為new data node 由後面新增)
 Rear pointer 放入
new data node的位置
30
Dequeue
itermPtr  存放回傳data位置的指標的位置 (指標變數)
*itermPtr  存放回傳data 的位置 (指標變數)
**itermPtr  回傳data的值
itermPtr 值不變
佇列無data node
如果為一只有
單節點之刪除
Counter - 1
 把前端欲刪除的data node,內含的dataPtr位置
回傳給存放data 位置的變數*itemPtr
*itemPtr = (*queue).(*front).dataPtr
deleteLoc= (*queue).front  把front pointer 指向的位置(front data node 位置)
放入 deletLoc
(*queue).rear = (*queue).front =Null  單節點刪除,front pointer and
rear pointer 同時設null
(*queue).front = (*queue).(*front).next
 將原先front data node的next指向位置放入front pointer
Recycle new data node
(因為front data node移除後,後面的node變為front)
Data Structures: A Pseudocode Approach with C
31
Queue Front
itermPtr  存放回傳data位置的指標的位置 (指標)
*itermPtr  存放回傳data 的位置 (指標)
**itermPtr  回傳data的值
itermPtr 值不變
 把前端欲回傳的data node,內含的dataPtr位置
回傳給存放data node位置的變數 *itemPtr
*itemPtr = (*queue).(*front).dataPtr
Data Structures: A Pseudocode Approach with C
32
Queue Rear
itermPtr  存放回傳data位置的指標的位置
*itermPtr  存放回傳data 的位置
**itermPtr  回傳data的值
 把後端欲回傳的data node,內含的dataPtr位置
回傳給存放data node位置的變數 *itemPtr
*itemPtr = (*queue).(*rear).dataPtr
Data Structures: A Pseudocode Approach with C
33
Empty Queue
Counter = 0  empty queue
Data Structures: A Pseudocode Approach with C
34
Full Queue
If the node was allocated successfully, we free it and return
false for not full.
If there was no memory left, we return true—the queue is full.
Data Structures: A Pseudocode Approach with C
35
Queue Count
(*queue).count : queue有多少data node
Data Structures: A Pseudocode Approach with C
36
Destroy Queue
若 Front pointer 仍有指向front data node
將 front data node 中的 data 所指向的資料空間釋放
將 front pointer 的位置 (front data node的位置)放入deletPtr
釋放queue
head node 空間
釋放front data
node空間
Data Structures: A Pseudocode Approach with C
將 front data node 的下一個data node的位置 放入 front pointer
(因為front data node 被刪除後 下一個data node變為front data node)
37
4-5 Queue Applications
We shows how to use a queue to categorize data.
• Categorizing Data (資料分類)
Data Structures: A Pseudocode Approach with C
38
Categorizing Data
重新整理,不破壞數列原始順序
Group 1
Group 2
Group 3
Group 4
保留原始數列順序
Numbers of each Group can be stored in queue
 可保留數列順序
Data Structures: A Pseudocode Approach with C
39
Categorizing Data
Create queues for categorizing data
數字分類1
數字分類2
數字分類3
數字分類4
Create queue for storing number 0~9
Create queue for storing number 10~19
Create queue for storing number > 29
enqueue for each queue
(對每個數字分類,
列印佇列
對應之佇列新增資料)
40
Categorizing Data
Fill category queues for categorizing data
數字分類1的queue 新增資料 for 0~9
數字分類2的queue 新增資料 for 10~19
數字分類3的queue 新增資料 for 20~29
數字分類4的queue 新增資料 for >29
Data Structures: A Pseudocode Approach with C
41
數字分類1
數字分類2
數字分類3
數字分類4
Create queues for categorizing data
Queue head node
0~9
數字分類1
6筆資料
10~19
數字分類2
6筆資料
20~29
數字分類3
6筆資料
> 29
數字分類4
6筆資料 每個數字分類 的數字順序 與 原始總數字列順序一樣
42
Categorizing Data
Main program
數字分類1
數字分類2
數字分類3
數字分類4
Create queue head node Create queue for storing number 0~9
Create queue for storing number 10~19
Create queue for storing number 20~29
Create queue for storing number > 29
Print queue
enqueue for each queue
(對每個數字分類,
對應之佇列新增資料)
43
Categorizing Data
Enqueue for queue q20to29
隨機產生的數字/10的商數=220~29新增queue
數字分類3
數字分類4
Enqueue for queue qOver29
>29新增queue
使用79個隨機種子數
產生25個數字,進行保留原順序的數字分類
隨機產生0~51的數字
隨機產生的數字/10分類依據
每印出11個數字就換行繼續
每個數字分類的數字順序 依照所產生25個數字排序
Enqueue for queue q0to9
數字分類1
數字分類2
隨機產生的數字/10的商數=00~9 新增queue
隨機產生的數字/10的商數=110~19新增queue
Enqueue for queue q10to19
44
Categorizing Data
印出數字分類1數字 0~9
印出數字分類2數字 10~19
印出數字分類3數字 20~29
迴圈 : 持續到數字分類queue 內容資料
全部被推出 data node全部被刪除
每印出10個數字就換行繼續 數字分類queue 的 Front data node
被推出 空間被回收
印出被推出的 Front data node 資料
印出數字分類4數字 >29
全部數字序列
四組數字分類
保留原數字序列排序
45
Download