ค้นหาบล็อกนี้


8 สิงหาคม 2554

บทที่ 5 “Stacks” (สแต็ก)


บทที่ 5
“Stacks”
(สแต็ก)

      สแต็ก (Stacks) เป็นลิสต์แบบเชิงเส้น (Linear Lists)  มีโครงสร้างข้อมูลที่จัดเก็บข้อมูลแบบเรียงลำดับต่อเนื่อง การเพิ่มข้อมูลลงในสแต็ก หรือการนำข้อมูลออกจากสแต็ก จะกระทำที่จุดปลายด้านใดด้านหนึ่งซึ่งมีลักษณะเข้าออกได้ทางเดียว โดยเรียกบริเวณนั้นว่า Top ของสแต็ก

การดำเนินงานพื้นฐานของสแต็ก
1.       ฟังก์ชัน Push การเพิ่มข้อมูลลงในสแต็ก จะใช้ฟังก์ชัน Push ซึ่งฟังก์ชันดังกล่าวจะทำหน้าที่เพิ่มรายการที่ตำแหน่งบนสุดของสแต็ก ปัญหาของ Push คือ ต้องมั่นใจว่าภายในสแต็กนั้นมีพื้นที่ว่างพอที่จะบรรจุข้อมูลใหม่ลงไปได้ ถ้าหากสแต็กเต็มหรือมีพื้นที่ว่างไม่เพียงพอ จะทำให้เกิดสถานะ Overflow State ส่งผลให้ไม่สามารถใส่ข้อมูลใหม่เข้าไปในสแต็กได้อีก
2.       ฟังก์ชัน Pop เป็นฟังก์ชันคืนค่าข้อมูลที่อยู่บนสุดของสแต็กส่งคืนให้กับผู้ใช้ พร้อมทั้งลบข้อมูลรายการนั้นออกไปด้วย ส่งผลให้ข้อมูลรายการถัดไปกลับมาอยู่ในสถานะบนสุดอีกครั้ง และเมื่อรายการสุดท้ายในสแต็กได้ถูกนำออกไปทั้งหมด สแต็กดังกล่าวก็จะถูกกำหนดให้อยู่ในสถานะว่าง (Empty State) แต่หากในขณะนั้นมีการเรียกฟังก์ชัน Pop บนสแต็กที่ว่างเปล่า จะทำให้เกิดสถานะ Underflow State จึงจำเป็นต้องตรวจสอบก่อนว่าสแต็กนั้นว่างหรือไม่
3.       ฟังก์ชัน Stack Top ฟังก์ชันนี้จะมีความคล้ายคลึงกับฟังก์ชัน Pop ที่คืนค่าข้อมูลโดยการคัดลอกข้อมูลบนสุดของสแต็กส่งคืนให้กับผู้ใช้ แตกต่างกันตรงที่ฟังก์ชัน Stack Top นั้น จะคืนค่าข้อมูลไปยังผู้ใช้งานเท่านั้น โดยไม่มีการลบข้อมูลออกจากสแต็กแต่อย่างใด

การสร้างสแต็ก
      เนื่องจากสแต็กเป็นโครงสร้างข้อมูลที่เป็นภาษาคอมพิวเตอร์ไม่ได้มีมาให้เหมือนกับอาร์เรย์ ดั้งนั้นจึงจำเป็นต้องสร้างขึ้นเอง โดยสามารถสร้างด้วยการแทนที่ข้อมูลสแต็กได้ 2 วิธี คือ
      การสร้างสแต็กด้วยอาร์เรย์ เป็นการจัดสรรพื้นที่หน่วยความจำแบบ Static ซึ่งต้องมีการกำหนดของสแต็กเพื่อใช้งานล่วงหน้าว่าต้องการขนาดเท่าไร จากนั้นก็ทำการจัดสรรเนื้อที่ภายในหน่วยความจำแบบคงที่ตายตัว และด้วยโครงสร้างอาร์เรย์ที่นำมาแทนที่ข้อมูลของสแต็ก จึงต้องจัดเก็บข้อมูลชนิดเดียวกัน
      ข้อเสีย
1.       ต้องมีการจัดสรรพื้นที่หน่วยความจำที่แน่นอนไว้ล่วงหน้า
2.       กรณีมีการเพิ่มข้อมูลลงในสแต็กมากเกินกว่าที่กำหนดไว้ก็จะส่งผลให้สแต็กเต็มได้ จะต้องแก้ไขโดยการจัดสรรพื้นที่ภายในหน่วยความจำจำนวนมากๆ เข้าไว้ ซึ่งก็จะทวีความสิ้นเปลืองยิ่งขึ้น
3.       กรณีที่มีข้อมูลน้อยหรือไม่มีข้อมูลในสแต็กเลย นั่นหมายความว่าจะต้องเสียพื้นที่หน่วยความจำไปโดยปริยาย

      การสร้างสแต็กด้วยลิงก์ลิสต์ เป็นวิธีหนึ่งที่มีประสิทธิภาพสูง ซึ่งลิงก์ลิสต์จะจัดหน่วยความจำแบบไดนามิก ดังนั้นจึงไม่ต้องกำหนดขนาดคงที่อย่างอาร์เรย์ คือหน่วยความจำจะถูกจัดสรรเมื่อมีการใช้งานจริงเท่านั้น อีกทั้งยังสามารถจัดเก็บข้อมูลต่างชนิดกันได้

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

อัลกอริทึมการสร้างสแต็กด้วยลิงก์ลิสต์
      ประกอบด้วย
1.       Create Stack
2.       Push Stack
3.       Pop Stack
4.       Stack Top
5.       Empty Stack
6.       Full Stack
7.       Stack Count
8.       Destroy Stack

      โครงสร้างข้อมูลแบบสแต็กนั้นจะเป็นลิสต์ที่มีข้อจำกัดหลายประการ ดังนี้
1.    การเพิ่มสมาชิกหรือข้อมูลจะสามารถจัดเก็บเรียงตามลำดับจากปลายด้านใดด้านหนึ่งเท่านั้น
2.    รายการข้อมูลที่เพิ่มเข้าไปจะอยู่บนสุด
3.     เราสามารถเข้าถึงรายการข้อมูลในสแต็กได้ ณ ส่วนบนสุดเท่านั้น
4.     การดำเนินงานใดๆ บนสแต็กจะเป็นไปตามประสิทธิภาพของฟังก์ชัน

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

การแปลงนิพจน์ Infix มาเป็น Postfix ด้วยมือ
1.       ให้ใส่วงเล็บให้กับทุกๆ นิพจน์ ด้วยการคำนึงถึงลำดับการคำนวณ
2.       ทำการเปลี่ยนสัญลักษณ์ Infix มาเป็นแบบ Postfix โดยเริ่มจากลงเล็บในสุดก่อน จากนั้นย้ายโอเปอเรเตอร์ตรงตำแหน่งวงเล็บนั้นไปยังตำแหน่งวงเล็บปิดของคู่นั้นๆ
3.       ถอดเครื่องหมายวงเล็บทิ้งออกให้หมด

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



**********จบแล้วจ่ะ**********



ไม่มีความคิดเห็น:

แสดงความคิดเห็น