วันอาทิตย์ที่ 9 สิงหาคม พ.ศ. 2552

DTS 07/04-08-2552

สรุปเรื่อง Stack
สแตก (Stack) เป็นโครงสร้างข้อมูลแบบลิเนียร์ลิสต์ มีคุณสมบัติ คือ การเพิ่มหรือลบข้อมูลในสแตก ลักษณะสำคัญของสแตก คือ ข้อมูลที่ใส่หลังสุดจะถูกนำออกมาจากสแตกเป็นลำดับแรกสุด เช่น การหยิบ CD, การหยิบจาน เป็นต้น
กระบวนการที่สำคัญ 3 กระบวนการ คือ
1.Push คือ การนำข้อมูลใส่ลงไปในสแตก ต้องดูด้วยว่าสามารถใส่ข้อมูลลงไปได้หรือไม่ ถ้าสแตกเต็มก็ไม่สามารถเพิ่มข้อมูลได้
2.Pop คือ การนำข้อมูลออกจากส่วนบนสุดของสแตก การ Pop ถ้าไม่มีสมาชิกในสแตก จะทำให้เกิดความผิดพลาดที่เรียกว่า Stack Underflow
3.Stack Top การคัดลอกข้อมูลบนสุดของสแตก แต่ไม่ได้เอาข้อมูลออก
การแทนที่ข้อมูลของสแตก
การแทนที่ทำได้ 2 วิธี
1.การแทนที่ข้อมูลของสแตกแบบลิงค์ลิสต์
จะประกอบด้วย 2 ส่วน คือ
(1)Head Node ประกอบไปด้วย top pointer และจำนวนสมาชิกในสแตก
(2)Data Node ประกอบไปด้วย ข้อมูลและพอยเตอร์
2.การแทนที่ข้อมูลของสแตกแบบอะเรย์
การดำเนินการเกี่ยวกับสแตก ของทั้งแบบลิงค์ลิสต์และแบบอะเรย์ ได้แก่
1.Create Stack คือ การจัดสรรหน่วยความจำให้ Head Node และส่งค่าตำแหน่งที่ชี้ของ 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 ตัว เช่น A+B-C
2.นิพจน์ Postfix จะต้องเขียนตัวถูกดำเนินการตัวที่ 1 และ 2 แล้วตามด้วย operator เช่น AB+C/DE*-
3.นิพจน์ Prefix จะต้องเขียน operator ก่อนแล้วตามด้วยตัวถูกดำเนินการตัวที่ 1 และ 2 เช่น -+A*BC/DE
ขั้นตอนการแปลงจากนิพจน์ Infix เป็นนิพจน์ Postfix
1.อ่านอักขระในนิพจน์ Infix เข้ามาทีละตัว
2.ถ้าเป็นตัวถูกดำเนินการจะถูกย้ายไปเป็นตัวอักษรในนิพจน์ Postfix
3.ถ้าเป็นตัวดำเนินการจะนำค่าลำดับความสำคัญของตัวดำเนินการที่อ่านเข้ามาเปรียบเทียบกับค่าลำดับความสำคัญของตัวดำเนินการที่อยู่บนสุดของสแตก
- ถ้ามีความสำคัญมากกว่า จะถูก push ลงในสแตก
- ถ้ามีความสำคัญน้องกว่าหรือเท่ากัน จะต้อง pop ตัวดำเนินการที่อยู่ในสแตกขณะนั้นไปเรียงต่อกับตัวอักษรในนิพจน์ Postfix
4.ตัวดำเนินการที่เป็นวงเล็บปิด ")" จะไม่ push ลงในสแตก แต่มีผลให้ตัวดำเนินการอื่นๆ ถูก pop ออกจากสแตกนำไปเรียงต่อกันในนิพจน์ Postfix จนกว่าจะเจอ "(" จะ pop วงเล็บเปิดออกจากสแตกแต่ไม่นำไปเรียงต่อ
5.เมื่อทำการอ่านตัวอักษรในนิพจน์ Infix หมดแล้ว ให้ทำการ pop ตัวดำเนินการทุกตัวในสแตกนำมาเรียงต่อในนิพจน์ Postfix
การคำนวณค่า Postfix ที่แปลงมา ตัวแปลภาษาจะทำการคำนวณโดยใช้โครงสร้างสแตกช่วย
ขั้นตอนในการคำนวณ
1.อ่านตัวอักษรในนิพจน์ Postfix จากซ้ายไปขวาทีละตัวอักษร
2.ถ้าเป็นตัวถูกดำเนินการให้ทำการ push ตัวถูกดำเนินการนั้นลงในสแตก แล้วกลับไปอ่านอักษรตัวใหม่เข้ามา
3.ถ้าเป็นตัวดำเนินการ ให้ทำการ pop ค่าจากสแตก 2 ค่า โดยตัวแรกเป็นตัวถูกดำเนินการตัวที่ 2 และตัวที่ 1 ตามลำดับ
4.ทำการคำนวณตัวถูกดำเนินการตัวที่ 1 ด้วยตัวถูกดำเนินการตัวที่ 2 โดยใช้ตัวดำเนินการในข้อ 3
5.ทำการ push ผลลัพธ์ที่ได้จากการคำนวณในข้อ 4 ลงสแตก
6.ถ้าตัวอักษรในนิพจน์ Postfix ยังอ่านไม่หมดให้กลับไปทำข้อ 1 ใหม่

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

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