วันเสาร์ที่ 25 กรกฎาคม พ.ศ. 2552

DTS : 06-29/07/2552

Stack

สแตก (Stack) เป็นโครงสร้างข้อมูลแบบลิเนียร์ลิสต์ ที่มีคุณสมบัติที่ว่า การเพิ่มหรือลบข้อมูลในสแตก จะกระทำที่ ปลายข้างเดียวกัน เรียกว่า Top ของสแตก (Top Of Stack) ลักษณะที่สำคัญของสแตก คือ ข้อมูลที่ใส่หลังสุดจะถูกนำออกมา จากสแตกเป็นลำดับแรกสุด เรียกคุณสมบัตินี้ว่า LIFO (Last In First Out)

การดำเนินงานพื้นฐานของสแตก
1. Push การเพิ่มข้อมูลลงในสแตก คือ การนำเข้ามูลเข้าสู่สแตกโดยทับข้อมูลที่อยู่บนสุดของสแตก ข้อมูลจะสามารถนำเข้าได้เรื่อยๆ จนกว่าสแตกจะเต็ม สมมติว่าสแตคจองเนื้อที่ไว้ N ตัว ถ้าหากค่า TOP เป็น 0 แสดงว่าสแตคว่าง หากค่า TOP = N แสดงว่าสแตคเต็มไม่สามารถเพิ่มข้อมูลลงในสแตคได้อีก

2. Pop การนำข้อมูลออกจากส่วนบนสุดของสแตก การนำข้อมูลออกจากสแตก ถ้าสแตกมีสมาชิกเพียง 1 ตัว แล้วนำสมาชิกออกจากสแตก จะเกิดสภาวะสแตกว่าง (Stack Empty) คือ ไม่มีสมาชิกอยู่ในสแตกเลย
แต่ถ้าไม่มีสมาชิกในสแตก แล้วทำการ pop สแตก จะทำให้ เกิดความผิดพลาดที่เรียกว่า Stack Underflow

การแทนที่ข้อมูลของสแตค ทำได้ 2 วิธี คือ
1. การแทนที่แบบลิงค์ลิสต์ ประกอบด้วย 2 ส่วน คือ
- Head Node ประกอบด้วย top pointer และจำนวนสมาชิกในสแตค
- Data Node ประกอบด้วยข้อมูลและพอยเตอร์ที่ชี้ไปยังข้อมูลตัวถัดไป
2. การแทนที่แบบอะเรย์
การดำเนินการเกี่ยวกับสแตค
1. Create Stack จัดสรรหน่วยความจำและส่งค่าตำแหน่งที่ชี้ไปยัง Head ของสแตคกลับมา
2. Push Stack การเพิ่มข้อมูลลงสแตค
3. Pop Stack การนำข้อมู,บนสุดออกจากสแตค
4. Stack Top เป็นการคัดลอกที่อยู่บนสุด โดยไม่มีการลบข้อมูล
5. Empty Stack เป็นการตรวจสอบการว่างของสแตค เพื่อไม่ให้เกิด Stack Underflow
6. Full Stack เป็นการตรวจสอบว่าสแตคเต็มหรือไม่ เพื่อไม่ให้เกิด Stack Overflow
7. Stack Count เป็นการนับจำนวนสมาชิกในสแตค
8. Destroy Stack เป็นการลบข้อมูลในสแตคทั้งหมด

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

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

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

ตัวอย่างการทำงานแบบ Lifo ที่ข้าพเจ้าเห็นในชีวิตประจำวัน
เช่น ยาสีฟัน ที่มีการบรรจุยาสีฟันส่วนที่อยู่ล่างสุด แต่เมื่อเราบีบยาสีฟันออกมาใช้ เราบีบส่วนที่อยู่บนสุดของหลอดบรรจุยาสีฟันออกมาใช้ก่อน

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

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