โครงสร้างข้อมูลคิว (Queue) by patoompon

VIEWS: 3,870 PAGES: 10

More Info
									                           รายงาน

                             เรื่อง

                     Queues (คิว)



                            เสนอ

                   อาจารย์ ดวงฤดี เรืองแสน




                          จัดทาโดย

                      นาย ณัฐพร สิงห์ชัย



                 ปวส. 2 เทคโนโลยีสารสนเทศ




รายงานเล่มนี้เป็นส่วนหนึ่งของวิชา โครงสร้างข้อมูลและขั้นตอนวิธี

                 ภาคเรียนที่ 1 ปีการศึกษา 2553

                  วิทยาลัยเทคนิคสุราษฎร์ธานี
                                           คานา

 รายงานเล่มนี้เป็นส่วนหนึ่งของวิชาโครงสร้างข้อมูลและขั้นตอนวิธี ประจาภาคเรียนที่
1ปีการศึกษา 2553 โดยนาเสนอเรื่องโครงสร้างข้อมูลของคิว ซึ่งจัดทาขึ้นด้วยตนเอง

หวังว่ารายงานของข้าพเจ้าจะเป็นประโยชน์ต่อผู้เรียนไม่มากก็น้อย ทั้งนี้ขอกราบขอบพระคุณ
อาจารย์ ดวงฤดี เรืองแสน
ผู้ให้ความรู้และคาแนะนาต่างๆเพื่อเป็นประโยชน์แก่การเรียนของข้าพเจ้าเป็นอย่างสูง




                                                                     ผู้จัดทา

                                                                 นาย ณัฐพร สิงห์ชัย
โครงสร้างข้อมูลคิว (Queue)
โครงสร้างข้อมูลแบบคิว (Queue) จัดเป็นโครงสร้างข้อมูลแบบรายการเชิงเส้น (Liner
Structure) ที่มีคุณลักษณะเฉพาะของตัวเอง
โดยมีกฏเกณฑ์ของการเพิ่มข้อมูลเข้าที่ปลายด้านหนึ่งของโครงสร้างหรือตรงส่วนท้ายของคิวและล
บข้อมูลหรือนาข้อมูลออกที่ปลายอีกด้านหนึ่งหรือตรงส่วนต้นของคิวซึ่งมีลักษณะดังกล่าวที่มาสาม
ารถพบเห็นได้ในเหตุการณ์ประจาวัน เช่น
การเข้าแถวคิวเพื่อทาธุรกรรมในธนาคารการเข้าแถวเพื่อซื้อตั๋วดูภาพยนต์



ลักษณะสาคัญของคิว
ลักษณะสาคัญของคิว คือ สิ่งที่เข้าไปในแถวคิว (แถวอันดับ)
เป็นอันดับแรกจะได้รับการปฏิบัติหรือถูกกระทาก่อน
และจบงานหรือหลุดกระบวนการออกจากแถวคิวเป็นอันดับแรกเช่นกัน
จึงเรียกคุณลักษณะโครงสร้างข้อมูลแบบคิวว่าเป็นโครงสร้างแบบ เข้าก่อนออกก่อน (First In
First Out : FIFO , First Come First Served : FCFS)

จากลักษณะการทางานดังกล่าว
จึงมีการนาโครงสร้างข้อมูลแบบคิวมาใช้ในงานคอมพิวเตอร์อย่างมากมายในหลายส่วนหลายระบบ
ซึ่งมีลักษณะการทางานเหมือนกับคิว เช่น ในระบบปฏิบัติการ (Operating System :
OS) ของคอมพิวเตอร์ในการจัดงานต่าง ๆ เข้าประมวลผลในระบบโทรคมนาคม
(Communication) , ในระบบการทดลองดาวเทียม (Satellite)




การนาข้อมูลเข้าสู่โครงสร้างข้อมูลคิว

เป็นกระบวนการอ่านข้อมูลจากภายนอกเข้าสู่โครงสร้างข้อมูลคิวทางด้านปลายที่พอยน์เตอร์ R
ชี้อยู่ เมื่อมีการนาข้อมูลเข้า สู่โครงสร้างคิวเรียบร้อยแล้ว พอยน์เตอร์ R จะเปลี่ยนตาแหน่ง
ชี้ไปยังตาแหน่งที่ว่างตาแหน่งถัดไป ข้อควรคานึงถึง คือ ในขณะที่คิวเต็ม (Full
Queues) หรือไม่มีช่องว่างเหลืออยู่
จะไม่สามารถนาข้อมูลเข้าไปเก็บในโครงสร้างคิวได้อีก ซึ่ง จะทาให้เกิดปัญหา
“Overflow” ขึ้น




ขั้นตอนการนาข้อมูลเข้าสู่โครงสร้างคิว มีดังนี้
1. เมื่อมีข้อมูลเข้าสู่คิว ให้ตรวจสอบว่าคิวเต็มหรือไม่

2. ถ้าคิวไม่เต็มให้เลื่อนตาแหน่งพอยน์เตอร์ R แล้วนาข้อมูลเข้าสู่คิว

3. ถ้าคิวเต็มไม่ให้มีการรับข้อมูล ตรวจสอบเงื่อนไขว่า ถ้าเป็นข้อมูลตัว แรกในคิว
ให้เปลี่ยนพอยน์เตอร์ F ให้ชี้ค่าแรก
                                                     1           2     3         4      5
 1. เมื่อคิวว่าง (Empty Queue)                  Empty        Empty    Empty   Empty   Empty

                                                F=0,R=0

                                                     1           2     3         4      5
 2. เมื่อนาค่า A เข้าสู่โครงสร้างคิว                 A       Empty    Empty   Empty   Empty

                                            F            R
                                                     1           2     3         4      5
 3. เมื่อนาค่า B เข้าสู่โครงสร้างคิว                 A           B    Empty   Empty   Empty

                                                 F           R
                                                        1         2                 3         4         5
            4. เมื่อนาค่า C เข้าสู่โครงสร้างคิว         A        B               C       Empty     Empty

                                                    F                           R
                                                        1         2                 3         4         5
            5. เมื่อนาค่า D เข้าสู่โครงสร้างคิว         A        B               C            D    Empty

                                                    F                                     R
                                                        1         2                 3         4         5
            6. เมื่อนาค่า E เข้าสู่โครงสร้างคิว
                                     Start
                                                        A        B               C            D         E
               ไม่สามารถนาข้อมูลเข้าได้อีก
                                                    F                                               R
                                  Check Full                Push Data to queue
Underflow           Yes
                                queue (R = N)               (Queue[R] = Data)



                                     No


                             Change Position Rear            Check First Data                     Set Pointer to Next
                                                                                        Yes
                              Pointer (R = R+1)              in queue (F =R)                            (F =1)




                                                                      No




                                                                  Sttop




        การนาข้อมูลออกจากโครงสร้างข้อมูลคิว
        เป็นลบข้อมูลออกจากโครงสร้างคิวทางด้านต้นของโครงสร้างคิว โดยมีพอยน์เตอร์ F
        เป็นพอยน์เตอร์ข้อมูลอยู่ เมื่อมีการลบข้อมูล ออกจากโครงสร้างคิวเรียบร้อยแล้ว พอยน์เตอร์ F
        จะเลื่อนตาแหน่ง ไปยังตาแหน่งถัดไป

        ข้อควรคานึงถึง คือ เมื่อคิวว่าง (Empty queue) หรือไม่มีข้อมูลเหลืออยู่
        จะไม่สามารถนาข้อมูลออกจากคิวได้อีก ซึ่ง จะทาให้เกิดปัญหา “underflow” ขึ้น
การนาข้อมูลออกจากโครงสร้างข้อมูลคิว
1. ตรวจสอบว่าเป็นคิวว่าง (Empty Queues) หรือไม่

2. ถ้าคิวไม่ว่างให้นาข้อข้อมูลออกจากคิว พร้อมเลื่อนตาแหน่งพอยน์เตอร์ F

3. ถ้ามีข้อมูลอยู่เพียงตัวเดียว ให้กาหนดให้พอยน์เตอร์ F และ R เป็นศูนย์ (0)




                                              1           2        3          4           5
 1. เมื่อคิวเต็ม (Full Queue)                 A           B        C          D           E

                                             F                                                R
                                              1           2        3          4           5
 2. เมื่อนำค่ำ A ออกจำกคิว                  Empty         B        C          D           E

                                                      F                                   R
                                              1           2        3          4           5
 3. เมื่อนำค่ำ B ออกจำกคิว                  Empty     Empty        C          D           E

                                                                                          R
                                                                  F

                                                  1           2        3          4           5
   4. เมื่อนำค่ำ C ออกจำกคิว                  Empty       Empty    Empty          D           E

                                                                              F               R
                                                  1           2        3          4           5
   5. เมื่อนำค่ำ ออกจำกคิว                    Empty       Empty    Empty      Empty           E

                                                                                      F           R
                                                  1           2        3          4           5
   6. เมื่อนำค่ำ E ออกจำกคิว                  Empty       Empty    Empty      Empty       Empty
      ไม่สำมำรถนำข้อมูลออกได้อีก
                                             F=0,R=0
                            Start




                        Check Empty                 Change Position Front
Underflow     Yes
                        queue (F = 0)                 Pointer (F = F+1)




                             No


                                                      Check Only Data             Set Pointer to Begin
                                                                            Yes
                     Pop Data from queue              in queue (F = R)               (F = 0,R = 0)
                      (Data = Queue[F])



                                                             No




                                                            Sttop




    สรุปการใช้งานโครงสร้างข้อมูลคิว
    จากการดาเนินการกับโครงสร้างคิวจะเห็นได้ว่า โครงสร้างคิวยังไม่มีประสิทธิภาพเพียงใดนัก
    เนื่องจากเหตุผลดังนี้
    เมื่อมีการเพิ่มข้อมูลจนเต็ม (Full Queue) และมีการลบข้อมูลออกจากโครงร้างคิวแล้ว
    พอยน์เตอร์ F จะยังคงอยู่ที่ตาแหน่งเดิม
    ไม่สามารถเปลี่ยนไปที่ตาแหน่งเริ่มต้นใหม่ได้จนกว่าจะมีการลบข้อมูลออกจากคิวหมดแล้ว(Emp
    ty Queue) จึงจะสามารถกาหนดพอยน์เตอร์ข้อมูล F และ R
    ให้กลับไปยังตาแหน่งเริ่มต้นใหม่ได้ ทาให้เสียพื้นที่ของโครงสร้างคิวในตาแหน่งที่พอยน์เตอร์ F
ผ่านมา ไปเนื่องจากต้องรอให้ตาแหน่งของพอยน์เตอร์ F ไปยังตาแหน่งสุดท้ายก่อน (เมื่อคิวว่าง)
จึงจะสามารถใช้พื้นที่ดังกล่าวได้

จากสาเหตุดังกล่าวมาแล้ว จึงได้มีการพัฒนาโครงสร้างคิวให้มีความยืดหยุ่นมากขึ้น
สามารถใช้งานพื้นที่โครงสร้างคิวได้อย่างเต็มประสิทธิภาพโดยการนาปลายทางของโครงสร้าง คือ
ด้านหน้าของโครงสร้าง (Front) และด้านหลังของโครงสร้าง (Rear)
มาเชื่อมต่อกันในลักษณะวงกลม เรียกว่า คิววงกลม (Circular Queue)




โครงสร้างข้อมูลคิววงกลม (Circular Queue)




ลักษณะของคิวว่าง   (Empty queues)        และคิวเต็ม (Full queues)
รูปแบบของโครงสร้างคิววงกลมมี2ลักษณะคือ

1. การดาเนินการเคลื่อนที่แบบทวนเข็มนาฬิกา (Counterclockwise)
2.การดาเนินการเคลื่อนที่แบบตามเข็มนาฬิกา(Clockwise)


จากรูปจะสังเกตว่า ในขณะที่คิวว่าง (Empty queues) และเมื่อคิวเต็ม
(Full queues) จะมีตาแหน่งที่พอยน์เตอร์ F อยู่ติดกับพอยน์เตอร์ R เหมือนกัน
ทาให้เกิดปัญหาขึ้นได้ในการตรวจสอบค่าของโครงสร้างคิววงกลม แก้ไขด้วยวิธี
การดังนี้
1. กาหนดค่าตรรกะ (Boolean) ขึ้นมาเพื่อใช้ในการตรวจสอบค่าคิวว่าง
(Empty queues) และคิวเต็ม (Full queues)
2. กาหนดตัวนับ (Counter) ขึ้นมาเพื่อนับจานวนข้อมูลว่ามีอยู่ในโครง
สร้างคิวเท่าใด

ขั้นตอนการเพิ่มข้อมูลเข้าสู่โครงสร้างคิววงกลม
1. ตรวจสอบว่าพอยน์เตอร์ R อยู่ที่ตาแหน่งสุดท้ายหรือไม่ ถ้าใช่ให้กา
หนดให้มาที่ค่าเริ่มต้น ถ้าไม่ใช่ให้เลื่อนตาแหน่งต่อไป
        2. ตรวจสอบว่าคิวเต็มหรือไม่ ถ้าไม่เต็มให้เพิ่มข้อมูล
        3. ตรวจสอบว่าข้อมูลที่เข้ามาเป็นค่าแรกในคิวหรือไม่ ถ้าใช่ให้พอยน์
        เตอร์ F เลื่อนตาแหน่งต่อไป



Start

                                                                r <> n ?    Yes   queue[r] = data




                                                                  No
r=n?                          No




                                                                f=0?        Yes        f=1
Yes




r= 1                         r=r+1                                No


                                                                 Stop
        ตัวอย่างลักษณะงานที่เป็นคิววงกลม

								
To top