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的商數=220~29新增queue 數字分類3 數字分類4 Enqueue for queue qOver29 >29新增queue 使用79個隨機種子數 產生25個數字,進行保留原順序的數字分類 隨機產生0~51的數字 隨機產生的數字/10分類依據 每印出11個數字就換行繼續 每個數字分類的數字順序 依照所產生25個數字排序 Enqueue for queue q0to9 數字分類1 數字分類2 隨機產生的數字/10的商數=00~9 新增queue 隨機產生的數字/10的商數=110~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