--- title: การบรรยาย วิชา โครงสร้างข้อมูลและอัลกอริทึม (IT ปี2) subtitle: date: วันจันทร์ที่ 23 กันยายน 2562 เวลา 08.50 น. --- (ข้อความสดจากระบบถอดความเสียงพูดทางไกล) วันสอบมีใครไม่ว่างไหม สอบทีหลังคนเดียวใช่ไหม ถ้าไม่ว่างก็สอบทีหลัง สอบคนเดียวค่ะ สอบทีหลังนะ เดี๋ยวมาเรียนต่ออีก 1 เรื่องนะคะ ก่อนที่เราจะสอบ ก็คือเรื่อง Queue คราวที่แล้ว ใช่ไหมคะ ยังจำได้ไหม คุณสมบัติของ สแตรก คือเข้าก่อนออกที่หลังนะคะ คุณสมบัติของ Stack ก็คือ เข้าก่อนนะคะ แล้วก็ออกที่หลัง คราวนี้ เราจะเห็นว่าคุณสมบัติของ Stack ก็คือ เข้าก่อน ออกทีหลังนะคะ มีแค่ 1 ทางถูกไหมคะ การเข้าออกนะคะ ของโครงสร้างข้อมูลแบบ Stack จะมีทางเข้าทางออก เวลาเราเพิ่มข้อมูลใส่เข้าไปข้อมูลจะอยู่ด้านบนหรือด้านล่าง ถ้าเราเพิ่มข้อมูลใหม่เข้าไป ข้อมูลจะอยู่ด้านบนนะคะ บนสุดของ Stack แล้วเวลาเอาออก ถูกไหมคะ เวลาเราเอาข้อมูลออกเราก็เอาข้อมูลที่อยู่ด้านบนสุดออกนะคะ รูปแบบของการจัดเก็บข้อมูลแบบ Stack นะคะ เราเก็บในรูปแบบที่เรียกว่า List เราเก็บข้อมูลที่เรียกว่าในรูปแบบที่เป็น List จะเก็บข้อมูลเรียงต่อไป แค่จับเอียงเฉย ๆ แต่รูปแบบจะเหมือนกัน ก็คือ เราจะเก็บข้อมูลเป็นช่อง ๆ นะคะ ถ้าเป็นแนวนอนแบบนี้ ตัวแรกนี่ก็คือตัวที่เก็บด้านซ้ายก็เรียงลำดับไปเรื่อย ๆ นะคะ การเก็บข้อมูลแบบ List เราจะมี Index นะคะ เป็นตัวกำกับหมายเลขช่อง ต้องการเอาข้อมูลออกช่องสุดท้ายก็ต้องรู้ว่า Index ตัวสุดท้ายคืออะไร แล้วก็ดึงข้อมูลออกมานะคะ หมายเลข Index ที่ชี้ใน List จะเริ่มต้นที่เลขอะไรเอ่ย เราจะเริ่มต้นที่ 0 ถูกไหมคะ หมายเลข index ก็คือหมายเลขของแต่ละช่องนี่จะเริ่มที่ 0, 1, 2 ไลไปเรื่อย ๆ นะคะ ต้องการเข้าถึงข้อมูลที่ index ตัวสุดท้ายก็คือเป็น Index หมายเลข 4 นะคะ เป็นแนวตั้งเหมือนกัน ก็จะเก็บข้อมูลโดยมีหมายเลข Index เป็นตัวชี้นะคะ เป็นตัวกำกับในแต่ละช่อง อันนี้คือ stack แล้วเรามีการเก็บข้อมูลที่เป็นแบบ List นะคะ อันนี้คือ 1 รูปแบบของ เราจะเรียนอีก 1 โครงสร้างก็คือ คิว คราวนี้ก่อนอื่น Stack จะมีคำสั่งที่เอาข้อเข้ากับเอาข้อมถูกไหมคะ คำสั่งของการเอาข้อมูลเข้าลงไปใน Stack ใช้คำสั่ง ใช้คำสั่งอะไรเอ่ย ใช่คำสั่งตัวไหน ถ้าเอาข้อมมีเอาข้อมูลเข้า กับนำข้อมูลออก สมมุติว่าใน Stสมมุติว่าใน Stack ถ้าเราต้องการเอาข้อมูลเข้าจะต้องใช้คำสั่ง Push หรือ Pop Put หรือ Pop ใช้คำสั่ง puPush จะต้องบอกด้วยว่าข้อมูลอะไร ใช่ไหมคะ ก็ใส่หมายเลขข้างใน Data อะไรก็ได้ที่เราต้องการ pop ก็คือเอาข้อมูลออกมา ก็จะส่งค่าออกมาว่า แล้วข้อมูลอะไรที่เราดึงออกจาก Stack นะคะ จะมี Push กับ Pop ถ้าพูดถึง Stack pop นะคะ คราวนี้มาดูเรื่องคิว ทุกคนรู้จักคิวไหมคะ เคยได้ยินคิวไหมคะ ในชีวิตประจำวัน เวลาทานไปซื้อข้าวที่โรงอาหารต้องเข้าคิวไหม ใช่ไหมคะ ก่อนจะขึ้นรถบัสกลับบ้าน ต้องต่อคิวไหม ต่อถูกไหมคะ หรือเราจะซื้อของอะไรก็ตามนะคะ ต้องมีการเข้าคิว ก็คือต่อคิว ไปแบงก์ต้องมีคิวไหม มี เราต้องไปกดขอบัตรคิวนะคะ จะได้ลำดับที่เท่าไร Queue นะคะ คิวในชีวิตประจำวัน เหมือนกันเลย ใครมาก่อน ได้ก่อนหรือได้ทีหลังได้ก่อนถูกไหมคะ ก็ต้องได้ก่อน คนมาทีหลังได้ทีหลังถูกไหมคะ เพราะฉะนั้น Concept ของคิว ก็คือ มาก่อนได้ก่อน เข้าก่อน เข้าก่อนออกก่อน ถูกไหมคะ เข้าก่อนออกก่อนคิว เข้าก่อนออกกก่อน แต่ถ้าเข้าก่อนออกที่หลังนั้นคือ Stack ใช่ไหมคะ คือรูปแบบของโครงสร้างจะมี 2 แบบ เพราะฉะนั้นเมื่อเราบอกว่า คิวคือเข้าก่อนออกก่อนนะคะ มันจะต้องมีทางเข้ากับทางออกคนละทางใช่ไหม เข้าทางหนึ่ง ออกทางหนึ่ง เข้าข้างหลังออกข้างหน้าถูกไหมคะ คิวคือเราคิว ต่อจากข้างหลัง แต่เวลาเอาออกใช่ไหมคะ ก็ต้องออกด้านหน้า Queก็คือจะมีอยู่ 2 ทาง ข้อมูลที่นำเข้าไปเก็บก่อน จะถูกนำไปใช้งานก่อน ข้อมูลที่เข้าไปทีหลังนะคะ ก็จะถูกนำออกมาใช้งานทีหลัง ใช้งานทีหลัง อันนี้คือคอนเซ็ปของ คิวที่เราเข้าใจ รูบแบบโครงสร้างของคิวนะคะ เราสามารถจัดเก็บได้แบบไหน เก็บได้เหมือนแบบ Stack จะเก็บโดยการใช้ List ก็ได้ เก็บโดยการใช้ Link List ก็ได้นะคะ รูปแบบแบบนี้ ก็คือ Link List ใช้ไหมคะ รูปแบบด้านซ้ายที่เป็นแนวตั้ง เราเก็บแบบ List เหมือน Stack เพราะฉะนั้นแล้วนะคะ คอนเซ็ปของ Q หรือ Stack หรือเป็น Link List ได้เหมือนกันนะคะ ตอน Stack เราใช้ List แล้วนะคะ พอมาคิวเดี๋ยวเราจะลองเก็บข้อมูลแบบนี้นะคะ เราจะเก็บข้อมูลที่เป็นแบบ Link List แบบนี้ ตัวนี้นะคะ Link List เหมือนกับรถไฟใช่ไหมคะ Link List รถไฟจะเป็นโบกี้ Link List ก็เหมือนกัน จะเก็บข้อมูลเป็น Node แล้วแต่ละโหนดก็เชื่อมด้วยกันนะคะ แต่ละ None ที่เราต้องการเหมือนกับในรถไฟ 1 โบกี้ ก็จะมีคนนั่ง ใช่ไหมคะ คนก็คือข้อมูลนั่นล่ะ ต้น List คืออะไร คืออะไรนะคะ รถไฟอะไรคือด้านหน้าหรือด้านหลัง มีอะไรเอ่ย ทำให้เราสังเกต มีหัวจักรถูกไหม หัวจักรจะเป็นตัวบอกว่านี่คือด้านหน้าของรถไฟ ใน Link List ตัวนี้ก็เหมือนกัน ด้านหน้าของ Link List คืออะไร มีอะไรชี้อยู่ มีลูกศร มีตัวชี้ที่ชื่อว่า Head ใช่ไหมคะ มีลูกศรที่ชื่อว่า Head ชี้อยู่ คือตัวนี้นะคะ เพราะฉะนั้น A B C D โหนดแรกของ LinkList ตัวนี้คือ A ใช่ไหมคะ แล้วโหนดสุดท้ายคืออะไรเอ่ย D Dog ใช่ไหมคะ None สุดท้าย ใน Queue เราจะรู้ได้อย่างไรว่าเป็น Node สุดท้าย มีตัวชี้ที่ชื่อว่า Tail Tail ตัวนี้จะเป็นตัวชี้ที่บอกว่า Node นี้ คือ Node สุดท้ายของ LinkList ตัวนี้นะคะ Head ชี้ที่ต้น List เทล ชี้ที่ท้าย list ทบทวนอีกแบบหนึ่ง ใน 1 Node นะคะ ตัวนี้เราจะมีชื่อเรียกว่าอะไรคะ None ใช่ไหมคะ 1 รูป 1 บ็อกตัวนี้คือ 1 Node แบ่งออกเป็นกี่ช่อง 2 ช่อง ใช่ไหมคะ ช่องแรกเอาไว้ทำอะไร ช่องนี้เอาไว้ทำอะไร ช่องด้านซ้ายเอาไว้เก็บอะไร เก็บข้อมูล ถูกไหมคะ ช่องด้านซ้ายเราไว้ใช้เก็บข้อมูล ใช่ไหมคะ เราใช้เก็บข้อมูล แล้วช่องทางขวาไว้ทำอะไร ช่องทางขวาไว้อะไรคะ ใน None แต่ละ None เหมือนรถไฟถูกไหมคะ เหมือนรถไฟ เวลาเราจะเชื่อมแต่ละ Node ต้องเชื่อมกันไหม แต่ละโบกี้ต้องเชื่อมไหม เชื่อม เพราะจะเป็นรถไฟได้อย่างไรใช่ไหมคะ มันก็ต้องเชื่อมกันใช่ไหมคะ ช่องด้านขวา จะเป็นช่องที่เอาไว้ใช้เชื่อม Node ถูกไหมคะ ช่องตรงนี้ที่อยู่ด้านขวาจะเอาไว้ใช้เชื่อมไปยัง Node ถัดไปมีชื่อเรียกไหม ช่องที่เก็บข้อมูล เราจะเรียนช่องนี้ว่าอะไร จำได้ไหม Data ใช่ไหมคะ จำได้ไหม ช่องที่เก็บข้อมูลจะมีชื่อเรียกว่า Beta แล้วช่องที่ใช้เชื่อมไปยังโหนดอื่น มีชื่อว่า ชื่อว่าอะไรเอ่ย ชื่อว่า Next ถูกไหมคะ 1 Node จะประกอบไปด้วย2 ส่วน ส่วนที่เก็บข้อมูลเรียกว่า Deta และส่วนที่ใช้เก็บตัวเชื่อมที่จะเชื่อม ที่ยังเชื่อมไปยัง node ถัดไป มีชื่อว่า Next คุ้นไหม เริ่มคุ้นไหม มีชื่อว่า Next จะมี data กับ next นะคะ นะคะ คราวนี้ คราวนี้สมมุติว่าครูมี Queue นะคะ ตัวนี้คือ Queue ครูมี Queue นะคะ มีกี่ Node Node ข้อมูลคืออะไร 10 Node สุดท้ายคือ 30 รู้ได้อย่างไร เพราะว่ามี Head กับ Tail เป็นตัวบอก ถูกไหมคะ อันนี้คือ Node แรกอันนี้คือ Node สุดท้ายนะคะ แล้วรู้ว่าโหนดแรก รู้ได้อย่างไร ก็มี Head ชี้อยู่ตรงนี้ รู้ได้อย่างไรคือ Node สุดท้าย ก็มี Teal ชี้อยู่นะคะ เราเลยรู้ว่า ได้ไหม คราวนี้นะคะ มาดูว่า Link List ตัวนี้นะคะ มี Head ชี้ที่ Node แรก มี นะคะ แต่ละ Node มีการเชื่อมโยงกัน เส้นเชื่อมนะคะ เส้นเชื่อมระหว่าง 20-30 ถ้าเราจำการทำงานของ Linklist ได้ ส่วนที่เก็บข้อมูล จะมีชื่อว่า Data นะคะ ส่วนที่ใช้เชื่อมจะมีชื่อว่า Next Next นะคะ Next เป็นตัวบอกว่า ชี้ไปที่ไหน Data จะบอกว่าโหนดนี้เก็บข้อมูลอะไรนะคะ ครูถามว่า Head.dataจะมีค่าเท่ากับเท่าไร Head คือตัวไหน คือตัวนี้ .data ก็คือข้อมูลใช่ไหมคะ เพราะฉะนั้น Node นี้เก็บค่าเท่าไร ถูกไหมคะ เพราะฉะนั้น Head.Data มีค่าเท่ากับ 10 มีใครสงสัยไหมว่า 10 มาจากไหน ได้ใช่ไหมคะ ถ้าอย่างนั้นครูถามต่อ Tail.data จะมีค่าเท่ากับ Tail.data เท่ากับ 30 นะคะ โอ.เค. ถ้าคำสั่งเป็น .Data ให้หาข้อมูลข้างใน Node นั้นมาใส่ คำตอบจะต้องเป็นค่าข้อมูล คราวนี้มาดูนะคะ Head. .Next แสดงว่า ต้องตอบเป็นค่าข้อมูลนะคะ ถ้าลงท้ายด้วย .data แสดงว่า เราอยากรู้ว่าข้อมูลคืออะไร Head ตัวนี้ถูกไหมคะ Head นะคะ เห็นไหม Head ชี้อยู่ที่ไหน ชี้อยู่ที่ 10 นะคะ Head.Next head.next คือตัวนี้ มันชี้ไปที่ไหน ชี้ไปที่โหนดถัดไป คือตอนนี้มันชี้อยู่ที่โหนดถัดไป แล้ว Node นี้ เขาว่า เพราะฉะนั้นตอบ ตอบเท่าไรคะ 20 นะคะ Head คือตัวนี้ .next .Next แล้วอย่างไร เพราะฉะนั้นตัวชี้อยู่ที่นี่ แล้ว .Data เพราะฉะนั้นคำตอบคือ 20 นะคะ ถัดมา tall tell.next ตัวแรกคือตัวชี้ ใช่ไหมคะ Tail ชี้อยู่ Node สุดท้ายนะคะ Tell.next มันไปชี้ที่ไหนไหม tell.next มันเชื่อมไปที่ Node ไหนไหมคะ มันคือ Node สุดท้ายแล้วใช่ไหมคะ เพราะฉะนั้นคำว่า .next ของมัน คือไม่ได้เชื่อมไปที่ไหนนะคะ คือไม่ได้เชื่อมไปที่ไหน ถูกไหมมันคือ Node สุดท้ายนะคะ มันไม่ได้เชื่อมอยู่ที่ไหน คราวนี้ครูถามอีก 1 ข้อ มาตัวนี้ค่ะ head.next .Next แล้วก็ .data ตอบเท่ากับ = 30 ถูกไหมคะ เราก็ต้องค่อย ๆ ไล่ Head ถูกไหมคะ .Next ชี้มาที่นี้ แล้ว .next อีกครั้งหนึ่ง ไปไหน มาที่นี่ แล้ว .data ก็เลยต้องตอบ 30 เริ่มไล่ถูกไหม ทีนี่่ลองดูก่อนนะ เรามาทบทวนตัว Link List ก่อนนะคะ พอเราทำใน Queue เราจะทำได้ ครูมี Link List ให้นะคะ คือตัวเดิมเลย 10 20 แล้วก็ 30 มี Head กับ Tail ชี้ให้เรียบร้อยนะคะ ครูบอกว่า ครูต้องการเพิ่ม Node ใหม่เข้าไปที่ท้าย list ครูต้องการเพิ่ม Node ใหม่ คือ Node 5 ถูกไหมคะ Node ข้อมูล 5 ตัวนี้ ไปไว้ที่ท้าย List เพราะฉะนั้น 5 จะต้องต่อ 10 หรือ อยู่หน้า 10 ท้าย List เพราะฉะนั้น 5 ต้องมาต่ออยู่ที่ 30 ถูกไหมคะ 5 จะต้องมาต่ออยู่ที่ 30 และ 5 จะเป็น Node สุดท้ายใช่ไหม พอเอา 5 มาต่อหลัง 30 5 กลายเป็น Node สุดท้ายใช่ไหม ใช่ 5 กลายเป็น Node สุดท้าย ปัญหาคือ ครูจะเชื่อม 5 มาอยู่หลัง 30 ได้อย่างไร อันดับแรกทำอย่างไรคะ เราก็ลองวาดเส้นถูกไหม 5 มันต้องเชื่อมมาที่เท่าไร 30 ต้องเชื่อมมาที่ 5 ถูกไหมคะ 30 ต้องเชื่อมมาที่ 5 ครูวาดเส้นเชื่อมละ ครูจะเขียนคำสั่งได้อย่างไร เส้นนี้ ที่เชื่อมมาใหม่นี่ที่ครูลากใหม่ จะต้องใช้คำสั่งอะไรดี คราวนี้มาดูว่าจะใช้จะใช้คำสั่งอะไร Node สุดท้ายตัวนี้มีอะไรชี้อยู่ มีอะไรคะ มี Tell ชี้อยู่ใช่ไหมคะ เราต้องการเชื่อมไปยัง Node ถัดไป เราต้องใช้ส่วนไหนเป็นตัวเชื่อม Data หรือ Next Next ถูกไหมคะ next ให้ชี้ไปที่ไหน เมื่อเราจุดตรงนี้ได้แล้ว tell.next ให้ชี้ไปที่ไหน ชี้ไปที่ 5 5 นี่มีอะไรชี้อยู่ มี P ชี้อยู่ ก็กำหนดให้ tell.next ชี้ไปที่ P ชี้อยู่ คราวนี้นะคะ ยังไม่จบ ถูกไหม ยังไม่จบ tell เราจะชี้ที่ไหน หน้าที่ของ Tail คือชี้ที่ท้ายสุด ตอนนี้อะไรคือท้ายสุด 5 ถูกไหม เพราะฉะนั้นต้องย้าย Tell จะย้าย Tail ได้อย่างไร ให้ Tail ชี้ที่ P ชี้อยู่ใช่ไหมคะ ให้ Tell ชี้อยู่ที่ P ชี้อยู่ที่ไหน ก็เอา Tail นั่นล่ะมาชี้นะคะ เราก็จะได้แล้วว่า node สุดท้ายของ linklist นี้ ข้อมูล 5 นะคะ รู้ได้อย่างไร นี่ไง Tail ชี้อยู่ จดโจทย์ไว้หน่อย มีกระดาษไหม มีกระดาษขี้นมาหน่อย ใส่ไว้ที่ Cassroom โดยการเปิด Class room ในรายวิชานี้ ครูอัปไฟล์ไว้หมดแล้ว คราวนี้ต่อ แล้วถ้าครูต้องการลบบ้าง เมื่อกี้ครูเพิ่มไปด้านหลังถูกไหมคะ ครูต้องการลบข้างหน้าบ้าง ลบ 10 นี้ออกมานะคะ เอา 10 นี้ออกไป เมื่อเราลบ 10 ออกไปแล้ว Node แรกของ LinkList ตัวนี้คือ 20 ถูกไหมคะ เมื่อลบ 10 ออกไปแล้วนี่ เพราะฉะนั้นเเราจะทำอย่างไร เราก็แค่ย้าย Head นี่มาชี้ที่ Node ถัดไป ถูกไหมคะ ที่ไหน Node นั้นคือ Node แรกเราจะย้าย Head มาที่ Node ถัดไปได้อย่างไร ใช้คำสั่งอะไรดี ให้ Head เลื่อนไปยัง Node ถัดไปHead เท่ากับ ให้ Head นี่ไปชี้อยู่ที่ 20 นั่นล่ะ จะไปได้อย่างไรเอ่ย จะไป 20 ก็คือ เดี๋ยวนะคะไปได้อย่างไร ให้Head ถูกไหมคไปชี้ที่ head.next ชี้อยู่ Head.Next ชี้อยู่ที่ไ20 ใช่ไหมคะ Head.next ถูกไหมคะ head.next ที่ Node 20 head=Headหมายความว่า ให้เอา head ไปชี้อยู่ที่ Head.Next ชี้อยู่ เหมือนกัน tail ไปชี้อยู่ที่ P ชี้อยู่ตรงนี้เมื่อ Head เลื่อนไปที่ Node 20 มันก็จะถูกลบไปโดยโอเค มีกระดาษไหมเอ่ย ใครไม่มีกระดาษมาหยิบนะ บางทีมันต้องจดนะ แล้วก็เย็บไว้ด้วยนะคะ ทุกคนได้กระดานะคะ ครูมี LinkList มาให้นะคะ 4 Node ครูมี Liที่เชื่อมกันไป Node มี 1 Node ที่ 2 มีค่า 3 Node ที่ 4 มีค่า 4 ครูกำหนด Head กับ Tail นะคะ ลองทำแบบฝึกหัดให้ครูหน่อย ข้อที่ 1 ครูต้องการเพิ่ม Node ใหม่เข้าไปที่ท้าย List นะคะ เพิ่ม node ใหม่เข้าไปที่ท้าย list โดยที่ Node ใหม่ที่ Queue คือ Queue ชี้อยู่ ทำอย่างไร วาดรูป ถูกไหมคะ แล้วก็เอา 5 ไปต่อด้านหลัง แล้วเขียนคำสั่งของเส้นที่เราเชื่อม ระหว่างโหนดข้อมูล 4 กับ โหนดข้อมูล 5 ใช้คำสั่งอะไรในการเชื่อม เชื่อมเสร็จ Tail ต้องอยู่ที่ไหนนะคะ อันนี้คือข้อที่ 1 ข้อที่ 2 นะคะ ลบข้อมูลต้น list ลบข้อมูลต้น List ลบอย่างไหน ก็เลื่อน Head ไปยัง Node ถัดไปเท่านั้นเอง ก็วาดรูปใช่ไหมคะ เราลบต้น List ออก แล้ว Head จะไปชี้อยู่ที่ไหน เลื่อน Head ด้วยคำสั่งอะไร 2 ข้อค่ะ ลองทำในกระดาษ ให้วาดรูปก่อนนะคะ แล้วก็เขียนคำสั่งลอกโจทย์ไว้ก่อน ลอกโจทย์รูปบนสุด ข้อ 1 ครูให้ใช้คำสั่งอะไร ข้อ 1 ลอกโจทย์ ค่อยวาดรูปการเชื่อม การเขียนคำสั่ง คราวนี้พอลอกโจทย์เสร็จ วาดรูปนี้เสร็จแล้ว มาทำข้อที่ 1 ลอกโจทย์ไว้ก่อน เพิ่ม Node ใหม่ที่ท้าย List ก็คือลอกโจทย์ไปก่อน แล้วก็มี Node ใหม่ใช่ไหมคะ พอลอกโจทย์เสร็จแล้ว เราก็มาวาด Node ให้มันเชื่อมต่อกัน เราก็เชื่อม Node เราก็เชื่อม Node ให้มันต่อกัน ถูกไหมคะ การเชื่อมตรงนี้จะเขียนคำสั่งว่าอะไร คำสั่งแรกเขียนว่าอะไร แล้วก็คำสั่งที่ 2 คำสั่งแรกเป็นอะไรคะ เส้นเชื่อม คำสั่งที่ 2 ก็คือเลื่อน tailถ้าใครเสร็จข้อที่ 1 เสร็จแล้ว ข้อที่ 2 ครูเอาข้อมูลที่ต้น list เราก็วาดรูปนะคะ ผลลัพธ์ที่ได้เป็นอย่างไร เป็นรูปนี้ Head มันมาได้อย่างไร Head มันมาได้อย่างไร Head มันมาได้ ต้องเขียนคำสั่งของการเลื่อน head ไปยัง Node ถัดไป ข้อ 1 นะคะ จะต้องมีอยู่ 2 คำสั่ง คำสั่งที่ 1 ก็คือเส้นเชื่อมใช่ไหมคะ คำสั่งที่ 2 ก็ต้องเลื่อน Tail นะคะ เพราะเราต้องข้างหลังน่ะ Node มันคงไม่ใช่ Node เดิมแล้ว ก็ต้องเลื่อน tail ไปที่ไหน ในการเขียนคำสั่งนะคะ ต้องดูด้วยว่า ทำคำสั่งไหนก่อน คำสั่งไหนหลังนะคะ ถ้าเขียนสลับ ความหมายก็จะเปลี่ยนทันทีนะคะ เราต้องเชื่อมก่อน เราต้องเชื่อมก่อนนะคะ แล้วค่อยเลื่อน Tail เราต้องวาดเส้นนี้ก่อนนะคะ ต้องวาดเส้นที่เชื่อมก่อน งเชื่อมได้แล้ว ต่อยขยับ Tailมาดูพร้อมกัน ข้อ 1 ถูกไหมคะ ครูบอกว่า ให้เพิ่ม Node ใหม่ไปที่ท้าย LinkList เพิ่ม Node ใหม่ไปที่ท้าย Link ครูให้เขียนคำสั่ง ใช่ไหมคะ เราจะเชื่อมระหว่าง Node 4 กับ Node 5 ได้อย่างไร ข้อแรกก็คือต้องเชื่อม Node จะใช้คำสั่งอะไร เรารู้ว่า นี่ เราเชื่อม Node 4 กับ Node 5 เราจะสั่งให้คอมพิวเตอร์นี่เพิ่มได้อย่างไรนะคะ เราก็ลองทำก่อน ก็คือเราก็ลากเส้นแบบนี้ เส้นนี้ คือเส้นใหม่ ที่เราจะต้องเชื่อมระหว่าง 2 Node นี้นะคะ เราจะเขียนคำสั่งเพื่อสร้างเส้นเชื่อมเส้นนี้นะคะ เส้นนี้ เราจะเขียนคำสั่งเพื่อสร้างเส้นเชื่อมเส้นนี้ เราจะใช้คำสั่งอะไร อะไร Node นี้มันออกมาจาก Node มี Tail ใช่ไหมคะ นี่จะอ้างถึงโหนดนี้ ต้องหาตัวชี้ให้ได้ Node นี้มี tail ชี้อยู่ ถูกไหมคะ เส้นเชื่อมที่เราสร้างออกจากส่วนที่ชื่อว่า Next นะคะ เพราะฉะนั้นก็จะเป็น Tail.next แล้วให้เชื่อมไปที่ไหน เชื่อมไปที่ Queue แล้ว 5 อะไรชี้อยู่ Queue ชี้อยู่ถูกไหมคะ พอพูดถึง next ต้องหาว่าจะชี้ไปที่ไหน พูดถึง Data ดูข้อมูลข้างใน Node ว่ามันคืออะไรนะคะ เสร็จแล้ว คำสั่งที่ 2 เมื่อเราสร้างเส้นเชื่อมนี้แล้ว โหนดสุดท้ายคืออะไรคะ คือ 5 ใช่ไหม เราจะเลื่อน tail มาที่ 5 ได้อย่างไร ก็คือ Tail = Queue ก็คือเอา Tail ไปชี้ที่ Queue ชี้อยู่ 1 ข้อ จบ ถูกไหมคะ นี่คือการเพิ่มโหนดใหม่ Tail ชี้ที่ Queue เพราะฉะนั้น tail จะชี้อยู่ที่นี่ ที่ 5 นะคะ และ Queue ก็ชี้อยู่ที่นี้เช่นกัน ถูกไหมคะ ครูไม่เขียนข้างหน้านะ ครูยกส่วนปลายมาเลย tail จะชี้อยู่ Queue ชี้อยู่ คือชี้ที่เดียวกันนะคะ คือชี้ที่ Node 5 จดเอาไว้ดูนะคะ จดเอาไว้ดูเร็วมีใครสงสัยไหมคะ อะไรชี้ไปไหน พยายามทำความเข้าใจนะคะ เวลาเราเชื่อมโหนดนี่เราก็ต้องรู้ว่าเส้นเชื่อม จุดแรกที่เราจะเชื่อมไปยังจุดถัดไป มีอะไรชี้อยู่ แล้วเราลากออกไปนี่ เราลากออกจากส่วนที่ชื่อว่า Next ใช่ไหมคะ แล้วชี้ที่ไหน ก็ชี้ไปที่นี่ แล้วที่นี้อะไรชี้อยู่ Queue มันก็เลยเป็น tail.next = Queue ครูเขียนภาษาไทยไว้ให้นะคะ tail.next=queue ก็คือ ให้ตัวชี้ Tail ในส่วน Next ชี้ไปที่ Queue ชี้อยู่ จะชี้หรือเชื่อมตรงนี้ก็ได้ เชื่อมไปที่ Queue ชี้อยู่ ส่วนคำสั่งที่ 2 tail เท่ากับ Queue ชี้ไปที่ Queue ชี้อยู่อันแรกเสร็จหรือยัง ครูเปลี่ยนได้ไหมเสร็จหรือยังคะ เสร็จหรือยังคะ เสร็จแล้วค่ะ คราวนี้มาดูข้อที่ 2 โจทย์บอกว่าให้ลบข้อมูล Node แรกของ Link List ก็คือ ลบโหนดแรกใช่ไหมคะ ก็คือลบข้อมูลตัวนี้ - 1 ลบแล้วจะเป็นแบบไหน เป็นแบบนี้นะคะ หลังจากลบ หลังจากลบ Node แรกแล้ว เราจะได้ผลลัพธ์ตามนี้ ใช่ไหมคะ แล้วเราจะลบ Node แรกออกไปได้อย่างไร ก็บอกเขาว่าลบไปยัง Head ชี้อยู่ที่ไน อันนั้นคือ Node แรก เพราะฉะนั้นเราจะลบโหนด 1 นะคะ Head จะต้องไปที่อยู่ที่ 2 ก็คือคำสั่งก็คือเลื่อน head ไปยังคำสั่งถัดไป ใช้คำสั่งว่า Head. Head=Head.Next หมายความว่าอะไร ให้ Head นะคะ ให้ Head ไปชี้ที่ Head.next ชี้อยู่ที่ 2 เพราะฉะนั้นเอา head ไปชี้ที่นี้ Head = Head.next ก็คือ ให้ Head ไปชี้ที่ head.ซึ่งก็คือ node ถัดไปจดเอาไว้ดูนะคะ โจทย์นะคะ เดี๋ยวท้ายชั่วโมทครูจะเช็กว่าใครจด 2 ข้อ หรือทำ 2 ข้อนี้หรือเปล่า เดี๋ยวครูจะติ๊กคะแนนนะคะ ลอกใส่กระดาษไว้ดูนะคะ เดี๋ยวก่อนเลิกนะ ครูจะดว่าใครจดบ้างให้จดก่อนนะคะจะเข้าใจหรือยังไม่เข้าใจ จดเอาไว้ดูพอเราจดนะคะ แล้วเราก็ต้องทบทวนนะคะ ค่อย ๆ ดูนะคะ ว่าเขาเขียนคำสั่งอย่างไร เขาเชื่อมเส้นอย่างไร ต้องกลับไปทบทวนนะคะ ไม่เข้าใจ ต้องถามเพื่อน จะมีเพื่อนส่วนหนึ่งพอเข้าใจอยู่ เขียนคำสั่งได้ ต้องไปถามนะคะ ต้องถาม ที่จด ๆ ใส่กระดาษต้องเก็บเอาไว้ด้วย จดใส่ไหนนะคะ เก็บเอาไว้ เวลาสอบนะคะ ครูจะให้เปิดเอกสาร วและตรวจเอกสารด้วยนะ ว่าเอาอะไรบ้างมา ถ้าที่จด ๆ ในห้องไม่ถือมานี่ ไม่ได้นะคะ จะเช็กว่าเอกสารครบไหม มีครบหรือเปล่านะคะ ไปเช็กกับเพื่อนนะคะ เพื่อนมีอะไรเราต้องมี เสร็จหรือยัง เสร็จหมดแล้วนะ คือเดี๋ยวครูจะวาง... วางเอกสารไว้บนโต๊ะให้นะคะ สามารถมาเอาบนโต๊ะหน้าห้องได้ โอ.เค. ถ้าจดไม่ทันนะคะ มาถ่ายรูปที่หน้าห้อง ท้ายชั่วโมง ทำไมเราต้องเรียน Link List เมื่อกี้นะคะ ทำไมเราต้องทบทวน linklist เพราะเราจะต้องใช้ นะคะ มาใช้ในการดำเนินการกับ Queue คราวนี้ แล้วเราใช้ Queue ยกตัวอย่างเช่น นะคะ เอกสารไป Print ที่เครื่อง Print ด้านหลังเรามีเครื่องปริ้นแค่เครื่องเดียว เราสามารถ Print ได้จากทุก ๆเครื่องพิมพ์เครื่องนั้น ใครที่ส่งไปก่อน ถูกไหมคะ มันก็จะมีการเข้าคิวเรียงลำดับมาเรื่อย ๆ คนที่ส่งไปก่อนก็จะปริ้นออกก่อนใช่ไหมคะ คนที่ส่งที่หลังก็ต้องรอนะคะ เหมือนเรา login เพื่อจองตั๋วอะไรสักอย่างหนึ่ง ใครเข้าก่อนก็จะได้จองก่อน คนเข้าที่หลังก็อาจจะตั๋วเต็มแบบนี้ก็จะไม่ได้จองนะคะ อันนี้คือการประยุกต์ใช้ Queue การดำเนินการกับคิว เราใช้คำสั่งอะไรบ้าง หรือทำอย่างไร ใน Queue ก็จะเหมือนกับใน Stack เลยนะคะ ก็จะใช้คู่กัน Queue เวลาเราเพิ่มข้อมูลลงไปใน Queue จะใช้คำสั่ง End Queue นะคะ ตัวนี้จะอ่านว่า End endQueue การเพิ่มข้อมูลลงไปใน Queue ส่วนการลบ Queue หรือการดึงข้อมูลออกจาก Queue จะใช้คำสั่ง DQueue นะคะ เพราะฉะนั้นใน Queue ถ้าเอาเข้าก็คือ End Queue เอาออกคือ DQueue เข้าคือ endQueue ออกคือ dQueue เราต้องมีการเช็กตรวจสอบสถานะว่า Queue ตอนนี้ เรามีข้อมูลอยู่หรือเปล่า ก็คือมี Node อยู่ไหม ถ้า Queue ของเราไม่มีโหนดอะไรอยู่เลย จะเรียก Queue นั้นว่า เป็น Queue ว่างคือไม่มีข้อมูลอยู่ใน Queue เลย เราจะเรียกว่า Emty ภาษาอังกฤษ ถ้าเราอยากรู้ว่าข้อมูลตัวแรกสุดที่อยู่ใน Queue คือ ข้อมูลแรกที่อยู่คือข้อมูลอะไร คือข้อมูลที่จะถูกเอาออกเป็นตัวแรกนะคะ เราจะใช้คำสั่ง เราจะเรียกคำสั่งนั้นว่า peak คราวนี้เรามาดูทีละตัวนะคะ การเพิ่มข้อมูลการเพิ่มข้อมูลลงไปใน หรือที่เรียกว่า endQueue การเพิ่มข้อมูลใหม่ การเพิ่มข้อมูลใหหม่ เราจะเอาไปต่อท้ายสุดถูกไหมคะ ตามโครงสร้างของ linklist ที่เราเรียนมา เพิ่มข้อมูลใหม่ เอาไปต่อท้ายใน LinkList นะคะ ถ้าเป็น Queue ถูกไหม เพิ่มข้อมูลใหม่ ถ้าเป็น linklist เพิ่มข้อมูลใหม่ ต่อด้านหลัง คราวนี้ครูให้เวลาอ่านตรงขั้นตอนการเพิ่มข้อมูลใหม่ อ่านของใครของมันสิคะ 4-5 บรรทัด ตรงนี้นะคะ ตรงขั้นตอนตรงนี้ ตรงขั้นตอนตรงนี้ อ่าน ต่างคนต่างอ่านเร็ว อ่านก่อน แล้วดูรูปประกอบ อ่านแล้วดูรูปประกอบด้วยนะคะ ครูให้เวลา นาทีหนึ่ง ทุกคนรู้จัก Head รู้จัก tail แล้วนะคะ อ่านหรือยัง อ่านนะคะ 5 บรรทัด เสร็จหรือยังคะ เสร็จแล้วนะคะ ขั้นตอนของการเพิ่มข้อมูลใหม่นะคะ เขาก็บอกว่า ขั้นแรกนี่ กำหนดให้ตัวชี้ head head จะชี้อยู่ที่ต้น Node ก็คือ Node แรก ชี้ที่โหนดสุดท้ายนะคะ อันนี้คือกำหนดให้ Head ชี้อยู่ที่ Node แรก ในการเพิ่มข้อมูลใหม่ ต้องมีการตรวจสอบก่อนว่าใน Link List ของเรานั้นมี node อยู่เดิมหรือไม่ นะคะ ถ้าไม่มี Node ใดอยู่ เรากำลังจะสร้าง node ใหม่ ของ Queue นี้นะคะ แต่ถ้ามีข้อมูลเดิมอยู่เราต้องเอาไปต่อข้างหลังนะคะ ในการตรวจสอบว่า เป็น Node ใหม่หรือเปล่า เราเช็กที่ Head ใช่ไหมคะ ถ้า Node มีค่าเป็น nunแสดงว่าใน linklist เรามี Node อยู่ไหม ครูถามว่า ถ้า Node เท่ากับ nun แสดงว่าใน linklist ของเรามี Node อยู่ไหม ไม่มีถูกไหม Head ไม่ได้ชี้ที่ไหนเลย Head ยังไม่รู้อยู่ตรงไหนเลย เพราะฉะนั้นมี Node ไหมไม่มีนะคะ เหมือนรถไฟนี่นะคะ ถ้าไม่มีหัวโบกี้ จะรู้ไหมอันไหนคืออันแรก ไม่รู้นะคะ ถ้า Head เท่ากับ NUN แสดงว่าเป็น Node ใหม่ คือเช็กว่า หรือเปล่า ถ้าเป็นโหนดใหม่ เราก็ให้ Head และ Tail ชี้ที่ Node ใหม่เลย แต่แต่ถ้าไม่ใช้ Node ใหม่นะคะ แต่ถ้าไม่ใช่โหนดใหม่ให้เอา Node ที่เราจะใส่เพิ่มไปต่อด้านท้ายถ้าไม่ใช่ Queue ว่าง ก็คือไม่มี Node ใด ๆ อยู่เลย ก็เอาไปต่อท้ายด้านหลัง ด้วยคำสั่งอะไร เมื่อกี้ทำไปแล้วน่ะ อันนี้คือ LinkList อันนี้คือ Node ใหม่ จะเชื่อมด้วยคำสั่งใหม่นะคะ tail. อะไร อะไร .Next เท่ากับอะไร จะเชื่อมตัวนี้มาที่นี้ ก็คือใช่ tail.next เท่ากั้บnewdata ก็เพราะมันมีตัวชี้ชื่อนี้ อันนี้ชื่ออะไร ก็เปลี่ยนไปนะคะ โอ.เค. ไหม งงไหมคะ ไม่งงถ้า ครูถามต่อ ถ้าเป็นกรณีแรกคือเป็น Queue ว่าง ไม่มี Node อะไรเลย ถ้าครูมี Node ใหม่ ครูมีตัวชี้ก็คือตัว P มีค่าเป็น 10 ตอนนี้ Link List ไม่มีข้อมูลอะไรเลย เราต้องให้ตัวชี้ ชี้อยู่ที่ไหน ชี้ที่ node ใหม่ คือชี้ที่นี่ถูกไหมคะ แล้วก็ให้อะไรชี้อยู่ที่นี่ด้วย Tail ใช่ไหมคะ จะใช้คำสั่งอะไร head=P Head=P เอา Head ไปชี้ที่ P ชี้อยู่ Tail ก็เช่นเดียวกัน ก็คือ tail=P ถูกไหมคะ กรณี LinkList นั้นไม่มีข้อมูลอยู่เลย เป็นคิวว่าง เวลาเราสร้างนะคะ หรือเชื่อม Node ใหม่เข้าไปใน Link List เราก็ต้องกำหนดให้ Head และ Tail ชี้ที่ Node ใหม่ด้วยคำสั่งนี้ จากที่เราพูดกันเมื่อกี้นะคะ จากขั้นตอนตรงนี้ เราแปลงให้เป็นคำสั่งได้ดังนี้นะคะ นะคะ ฟังก์ชันของ End Queue เห็นไหมคะ อันดับแรกเราต้องมีการสร้าง Node ก่อน สร้าง Node ก็คือสร้างสี่เหลี่ยมตัวนี้ถูกไหมคะ แล้วก็ใส่ข้อมูลเข้าไป แล้วก็มีตัวชี้ชื่ออะไร New Data ถูกไหมคะ เรากำหนดให้ตัวชี้คือ NewData คือ 10 นะคะ นี่คำสั่งแรก ก็คือสร้าง Node สี่เหลี่ยมตัวนี้ขึ้นมา เสร็จแล้วก่อนจะเชื่อมเข้าไปที่ LinkList เช็กก่อนว่า มันมี node เดิมอยู่หรือเปล่า ก็คือเช็กว่า Head is null หรือเปล่า ถ้า Head is nun ก็คือเป็นคิวว่าง เราก็ให้ Head ชี้ที่ Node ใหม่ แล้วก็ให้ Tail ชี้ที่ Node ใหม่ เราสามารถเขียนคำสั่งนี้ได้อีกแบบ New Data หรือ ได้เหมือนกันนะคะ ถ้ากรณีเดิมที่มันมี node อยู่แล้ว เราก็เชื่อม ตรงนี้เราก็เชื่อมไปที่ Node สุดท้าย เลื่อน Tail ไปยังโหนดสุดท้ายนะคะ เลื่อน Tail ไปยัง โอ.เค. นะคะ อันนนี้คือการเพิ่มลงไปใน Queue เอาออกบ้าง เอาออกหรือว่าลบข้อมูเวลาเอาออกนะคะ เวลาเอาออกเอาด้านหน้าออกนะคะ ลบด้านหน้าออก ดูขั้นตอน มี 3 ขั้นตอน อ่านก่อนค่ะ มีอยู่ 3 ขั้นตอน มีอยู่ 3 ขั้นตอนอ่านให้ครูหน่อย ขั้นตอนของการดึงข้อมูลออกจาก Queue เราก็ดึงข้อมูลออกมาจากโหนดแรกจะได้รู้ว่าข้อมูลที่ลบหรือข้อมูลที่ดึงออกมานี่ มันเป็นข้อมูลอะไร เผื่อเราจะเอาไปใช้ต่อหรือเอาไปทำอะไรต่อนะคะ เราดึงออกมาแล้ว แล้วเราก็เก็บเอาไว้ในตัวแปรที่เราสร้างขึ้นนะคะ พอเรารู้แล้วล่ะว่าค่าที่จะเอาออกคือค่าอะไร เราก็เลื่อ Head ไปยัง Node ถัดไปนะคะ ขั้นที่ 2 เลื่อน Head ไปยังโหนดถัดไป พอเราเลื่อน Head ไปยังโหนดถัดไปนะคะ กรณีที่ถ้า head ไม่ได้ชี้อยู่ที่ไหนเลย Node ที่เราลบ คือ Node สุดท้ายที่อยู่ใน Queue โหนดที่เราลบนะคะ ก็คือNode สุดท้ายที่อยู่ใน Queue node นั้นไปแล้ว head จะต้องชี้อยู่ที่ Null เมื่อ Head ชี้อยู่ที่ Null แล้ว Tail ก็ต้องชี้อยู่ที่ nun ด้วน อยู่ใน queue เวลาเราลบ เราลบอย่างไร เราใช้สั่ง ก็คือ DelQueue แล้วก็สร้าง dqueue คำสั่งแรก ดึงข้อมูลออกมา ไปที่ Head ที่อยู่ เราก็ค่าหน่อยว่า มันมีค่าอะไร node ที่เรากำลังจะลบ มันเก็บค่าอะไรนะคะ เราก็เก็บข้อมูล แล้วเอาไปใส่ในตัวแปรที่ชื่อว่า Data นะคะ ตัวแปรด้านซ้ายนะคะ จากนั้นให้เลื่อน Head ไปยัง Node ถัดไปก็คือ Head=Head.next ตรวจสอบหน่อยว่า ตอนนี้ไม่มีอะไรอยู่ใน linklish เลย ถ้า Head เป็น Null แล้ว ก็กำหนดให้ Tail มีค่าเป็น Null ด้วย คราวนี้ในการตรวจสอบว่าเป็น Queue ว่างหรือเปล่า คำว่า Queue ว่างแปลว่า ไม่มีข้อมูลอะไรเลยใน Queue Queue ก็คือไม่มีข้อมูลอะไรเลยที่อยู่ใน Queue นะคะ จะตรวจสอบได้อย่างไรว่าเป็น คิวว่าก็เช็กว่า head=Null หรือเปล่า ถ้า Headแสดงว่าเป็น Queue ว่าง ต่อนะคะ แรกสุดที่อยู่ใน Queue นั่นล่ะ อยากรู้ว่าข้อมูลแรกที่อยู่ Queue คืออะไร เราก็เช็กว่า Hhead. head.data คืออะไรก็เหมือนที่ครูถามตอนต้น ๆ นะคะ Head.Data ก็คือข้อมูลแรกที่อยู่ใน Queue Queue เวลาข้อมูลเข้าหใมจะอยู่ด้านหน้าหรืออยู่ด้านหลังค่ะ ด้านหน้าหรือด้านหลัง เวลาเอาข้อมูลออกจาก Queue เอาข้อมูลออกจากด้านหน้าหรือด้านหลัง ด้านหน้านะคะ ดูให้ดี ๆ อันไหนคือด้านหน้า ด้านหลัง มีกระดาษเพิ่มอยู่ใช่ไหมคะ ครูมีโจทย์อยู่ 3 ข้อ ทำเหมือนเดิมเลย ข้อแรกครูกำหนด head กับ tail ให้ด้วย ครูบอกว่า เพิ่ม Node ใหม่ ตัวชี้ โหนด 1 ชี้อยู่ เพิ่มโหนดนี้ เพิ่ม Node 1 ไปต่อด้านหลัง วาดรูปอย่างไร แล้วใช้คำสั่งอะไร ข้อ 2 เพิ่มไปแล้ว ลบออกบ้าง ลบข้างหน้าใช่ไหมคะ ถัดมาข้อ 3 เพิ่มตัวชี้ Node 2 Node ที่มีตัวชี้ Node 2 นี่ ลงไปใน Queue LinkList คำสั่งครูบอกหมดแล้วใช่ไหมคะ เหมือนในแบบฝึกหัดแรกที่ครูให้ทำ และเฉลยให้ด้วย เลียนแบบนะคะ เลียนแบบทำความเข้าใจว่า ทำอย่างไรในแบบฝึกหัดที่ครูให้นี้ ดูจากเฉลยอันเก่า แล้วลองทำอันใหม่ ดูว่าจะทำได้ไหมนะคะ ครูเพิ่มข้อมูลใหม่ใน queue ก็ต้องไปเพิ่มด้านหลัง ครูลบข้อมูลออกจาก Queue ก็ต้องลบข้างหน้า ครูไม่บอกว่าไปต่อท้ายอะไร ลบข้อมูลตัวไหนออก แต่ทุกคนต้องเข้าใจว่า Queue นี้ เวลาเราเพิ่ม เพิ่มด้านหลัง เวลาเราลบ ลบข้างหน้านะคะ ลงมือทำ 3 ข้อ โจทย์คราวที่แล้ว ใครยังลอกไม่เสร็จ มาถ่ายรูปเอาข้างหน้านะคะ แล้วเอาไปดูทำลงกระดาษ ลงสมุดนะคะ ข้อ 3 นะคะ ข้อ 3 นะคะ จะใช้รูปข้างบน หรือจะใช้รูปต่อจากข้อ 1 คำสั่งไม่แตกต่างกันเลยนะคะ เพราะเราเชื่อมต่อจาก tail คุณจะชี้อยู่ที่ไหนก็ได้ ถูกไหมคะ จะใช้รูปข้างบนก็ได้ หรือจะใช้ต่อจากรูปข้อ 1 ก็ได้ เลือกเอาอใครเสร็จแล้วเขียนชื่อส่งนะคะ ใครทำเสร็จแล้วนะคะ เอามาส่งครู รวมถึงแบบฝึกหัดก่อนหน้าที่ทำในห้องด้วย ถือมาด้วย เวลาเขียนคำสั่งนะ next next สะกดให้ถูก N-E-X-T นะคะ ตัว N เดี๋ยวนะคะ เดี๋ยวครูจะเช็กชื่อแล้วก็เอางานมาส่งหน้าห้องนะคะ [ [สิ้นสุดการถอดความ]