งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

โครงสร้างข้อมูลแบบสแตก (stack)

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "โครงสร้างข้อมูลแบบสแตก (stack)"— ใบสำเนางานนำเสนอ:

1 โครงสร้างข้อมูลแบบสแตก (stack)

2 ลักษณะโครงสร้างของแสตก
ลักษณะโครงสร้างข้อมูลแบบสแตก เป็นลักษณะโครงสร้างขัอมูลแบบบัญชีรายการเชิงเส้น(linear list)ซึ่งจะมีการปฏิบัติงานต่าง ๆ เช่น การนำสมาชิกเข้ามาเพิ่มในบัญชีรายการ หรือการนำสมาชิกใดสมาชิกหนึ่งออกจากบัญชีรายการ จะต้องกระทำในทิศทางเดียวกันเสมอ และจะต้องกระทำที่ปลายเพียงด้านเดียวเท่านั้น

3 ดังนั้นลักษณะของแสตกจะเหมือนกับที่ถาดซึ่งมีลักษณะดังนี้
Top tray of pile Stacked trays spring

4 การเก็บข้อมูลในโครงสร้างแบบ STACK และการดึงข้อมูลมาใช้งานในลักษณะของสแตกจะเป็นลักษณะที่เรียกว่า lifo (last - in, first - out) คือสิ่งที่ถูกเก็บที่หลังสุดจะถูกดึงมาทำงานก่อน ดังนั้นถ้าให้ s เป็นบัญชีรายการเชิงเส้นซึ่งมีสมาชิกเป็น a1,a2,…,an ลักษณะของบัญชีรายการเชิงเส้นนี้จะถูกเก็บในสแตกดังนี้ insert delete an Top element of stack a3 a2 a1

5 ในการปฏิบัติงานกับลักษณะโครงสร้างข้อมูลแบบสแตกนั้น เราจะสนใจในลักษณะของ
1. การนำสมาชิกใหม่เข้าไปเก็บเพิ่มในสแตก (insertion) ในลักษณะการนำสมาชิกเข้าไปเก็บเพิ่มในสแตกนั้นจะสามาระนำไปเก็บเพิ่มเติมได้ทีละ 1 สมาชิกนั้น ซึ่งการเพิ่มสมาชิกเข้ามานี้เราจะเรียกว่า การ push stack 2. การนำสมาชิกออกจาก stack (deleteion) เป็นการนำสมาชิกออกจากสแตก ซึ่งการนำสมาชิกที่อยู่ตัวบนสุดของ stack เท่านั้น การนำสมาชิกออกจากสแตกนั้นจะเรียกว่า การ pop stack

6 ถ้าเรามองการเก็บข้อมูลแบบสแตกโดยใช้ตัวแปรแถวอันดับก็จะเหมือนกับตัวแปรแถวอันดับนั้นมีรอบด้าน และทำงานได้เพียงด้านเดียว ซึ่งการนำค่ามาเพิ่มหรือการเอาค่าออกไปจะทำได้เฉพาะตัวที่อยู่บนสุดเท่านั้น ดังนั้นถ้าให้ตัวแปรแถวอันดับ s(1:n) แทนลักษณะของสแตก จำนวนสมาชิกที่สูงที่สุดในสแตกนี้คือ n จำนวน ถ้าให้ top เป็นดัชนีกำกับ (subscript) ที่ทำหน้าที่ชี้สมาชิกด้วยที่อยู่บนสุดของสแตกซึ่งจะเป็นสมาชิกตัวที่ถูกทำงานต่าง ๆ ดังนั้นถ้าในสแตกไม่มีค่าอะไร ซึ่งจะเรียกว่า empty stack ค่าของ top ก็จะเท่ากับศูนย์ และค่าสูงสุดของ top ก็จะมีค่าเท่ากับสูงสุดของความสามารถของสแตกที่จะเก็บค่าไว้ได้ ซึ่งเรียกว่า stack capacity

7 การประยุกต์ใช้สแตก (application of stack)
ในการนำสแตกมาประยุกต์ใช้นั้นจริง ๆ แล้วสแตกสามารถนำมาประยุกต์ใช้กับงานทางด้านคอมพิวเตอร์ได้เป็นจำนวนมาก แต่ในที่นี้จะอธิบายให้เห็นชัดเจนถึงประโยชน์ของการนำเอาสแตกมาใช้งาน 2 อย่างคือ 1. Recursion 2. Infix และ postfix notation

8 Recursion เป็นเทคนิคของการแก้ปัญหาของเซทหรือของการประมวลผล โดยใช้การเรียกตัวเองมาใช้งาน ดังนั้น recursion procedure จะหมายถึง ส่วนของโปรแกรมที่สร้างขึ้นมาแล้วสามารถเรียกตัวเองมาใช้ได้ ซึ่งในทางคอมพิวเตอร์จะพบลักษณะของการเรียกตัวเองมาใช้งานหลาย ๆ อย่าง เพื่อทำให้การทำงานนั้น ๆ สะดวกและง่ายขึ้น ดังนั้นในภาษาคอมพิวเตอร์บางภาษาจึงมีลักษณะการเขียนโปรแกรมแบบเรียกใช้ตัวเองได้ เช่น ภาษา pl/1, pascal, algol และ snoblo4 ในการเขียน recursive rpeceddure ใด ๆ จำเป็นจะต้องมีเงื่อนไขที่สำคัญ 2 ประการคือ 1. ในการเรียกตัวเองใช้จะต้องเรียกตัวเองที่อยู่ใกล้ที่สุดก่อน 2. จะต้องมีกฏเกณฑ์ที่แน่นอนว่าการประมวลผลจะทำไปถึงจุดใดจึงจะหยุดการทำงาน

9 Infix & postfix notation
เป็นเรื่องของการใช้เครื่องหมายในลักษณะที่เป็นรูป infix และ postfix ซึ่งก่อนศึกษาการใช้เครื่องหมายทั้ง 2 อย่างนี้ ควรกลับมาทบทวนเรื่องนิพจน์คณิตศาสตร์ (artthmetic expression) นิพจน์ (expression) คือการนำเอาตัวแปรและค่าคงที่มาสัมพันธ์กัน โดยมีเครื่องหมายคำนวณเป็นตัวเชื่อมก็เรียกนิพจน์คณิตศาสตร์ (arithemtic expression) ถ้าตัวแปรและค่าคงที่มาสัมพันธ์กันโดยมีเครื่องหมายเปรียบเทียบ หรือเครื่องหมายตรรกะเป็นตัวเชื่อมก็เรียกนิพจน์ตรรกะ (logical expression) ในการศึกษาเรื่อง infix และ postfix นี้เราจะสนใจแต่นยิพจน์คณิตศาสตร์ซึ่งมีเครื่องหมายที่ใช้เป็นตัวเชื่อมคือ 1. ยกกำลัง (**) 2. คูณกับหาร (* กับ /) 3 บวกกับลบ (+ กับ -)

10 Postfix notation เป็นลักษณะของการเขียนนิพจน์คณิตศาสตร์ซึ่งมีรูปแบบคือ operand operator operand คือเครื่องหมายอยู่ระหว่างตัวแปรหรือค่าคงที่นั่นเอง ซึ่งได้แก่นิพจน์คณิตศาสตร์ในภาษาระดับสูงทั่ว ๆ ไปของคอมพิวเตอร์นั่นเอง เช่น a + b operand operator operand

11 เราสนใจในเรื่องการหาค่าของนิพจน์คณิตศาสตร์ที่อยู่ในลักษณะที่เป็น infixnotation การหาค่าของนิพจน์โดยปกติจะต้องทำจาก ซ้ายไปขวา เสมอ โดยมีลำดับความสำคัญของเครื่องหมายจากมากที่สุดไปหาน้อยที่สุด ดังนี้ 1 ** (ยกกำลัง) 2 * กับ / 3 + กับ - ในกรณีที่มีวงเล็บจะทำภายในวงเล็บในสุดก่อน และทำจากซ้ายไปขวาโดยทีลำดับของเครื่องหมายเช่นกัน ยกเว้นในกรณีที่นิพจน์ที่มีเครื่องหมายกำลังล้วน ๆ จะทำจากขวามาซ้าย

12 Postrix notation เป็นลักษณะของการเขียนนิพจน์คณิตศาสตร์ที่มีรูปแบบการเขียนดังนี้คือ operand poerand operation ลักษณะที่สำคัญของนิพจน์แบบ postfix คือ 1. เครื่องหมายทุกตัวจะต้องอยู่ข้างหลังตัวกระทำ (operand) 2 ตัวเสมอ 2. เครื่องหมายทุกตัวจะถูกวางอยู่ในลำดับที่ถูกต้องในการปฏิบัติงาน คือ เครื่องหมายใดที่จะทำเป็นตัวแรกจะถูกวางไว้ในอันดับที่ 1 เครื่องหมายที่จะทำตัวที่ 2 ก็จะถูกวางไว้เป็นอันดับที่ 2 และวางต่อ ๆ กันไปเช่นนี้จนจบ 3. ไม่มีเครื่องหมายวงเล็บในนิพจน์

13 จากลักษณะของ postfix จะพบว่าการหาค่าของนิพจน์ที่อยู่ในรุป postfix นั้นจะช่วยลดปัญหาที่สำคัญ 2 ประการคือ 1. ลดความยุ่งยากในการใส่วงเล็บเพื่อแสดงลำดับการทำงานก่อนหลังของเครื่องหมาย 2. ลดปัญหาตรวจดูและลำดับการทำงานของเครื่องหมาย ในการเขียนนิพจน์คณิตศาสตร์ด้วยภาษาระดับสูงใด ๆ เรามักจะเขียนอยู่ในรูปของ infix form แต่เมื่อคอมพิวเตอร์ทำนิพจน์นั้น ๆ มันจะเปลี่ยนนิพจน์ที่อยู่ในรูป infix form ให้อยู่ในรูป postfic form ก่อนแล้วทำการทำงานตามนิพจน์ในรูป postfix form จนได้ผลลัพธ์

14 ดังนั้น เราจึงต้องศึกษาวิธีการเปลี่ยนจาก infix form เป็น postfix form
2. พิจารณาวงเล็บในสุดออกมาโดยเอา operator ที่อยู่ระหว่าง operand มาแทนวงเล็บปิดของวงเล็บนั้น ๆ 3. เมื่อแทนวงเล็บปิดด้วยเครื่องหมายจนหมดแล้วให้เอาวงเล็บเปิดออกทิ้งไปให้หมด

15 วิธีเปลี่ยน infix form เป็น postfix form โดยใช้สแตก
จะเห็นว่า infix form เป็น postfix form นั้นลำดับของ operand ไม่เปลี่ยนแปลง แต่ลำดับของเครื่องหมาย (operator) จะเปลี่ยนแปลง ดังนั้นถ้าจะใช้วิธีการของสแตกมาช่วนในการเปลี่ยนจาก infix เป็น postfix นั้นค่าเราสนใจจะนำมาเก็บในสแตกราวเป็นเครื่องหมาย จะเห็นว่าในการเปลี่ยน infix form เป็น postfix form นั้น priority ของเครื่องหมายจะสำคัญโดยจะพิจารณา pririty ของเครื่องหมายเป็น 2 แบบคือ 1. Priority ของเครื่องหมายที่อยู่ใน stack เราเรียกว่า in stack priority จะใช้ตัวย่อว่า isp 2. Priority ของเครื่องหมายที่กำลังจะถูกนำลงสู่ stack เราเรียกว่า in coming priority จะใช้ตัวย่อว่า icp

16 การกำหนด isp และ icp จะใช้หลักที่ว่า operator ที่มี priority สูงก็จะมี isp และ icp สูงกว่า operator ที่มี priority ต่ำกว่า และ operator ที่จะถูก push ลงสู่ stack ได้จะต้องมีค่า icp isp

17 ดังนั้นถ้าเราให้ isp และ icp ของเครื่องหมายต่าง ๆ ดังนี้
Symbol isp icp ( ** * / ) empty stack

18 เราจะสามารถสร้าง procedure ในการเปลี่ยน infix form ให้เป็น postfix form ได้โดยถ้าให้ next-token เป็น procedure ซึ่งทำหน้าที่ส่งค่าของแต่ละ token ใน infix form มาให้เราในแต่ละครั้งที่มีการเรียก เช่น ถ้า infix เป็น a+b*c ในการเรียกแต่ละครั้งจะได้ token ดังนี้ Token = next - next (infix) นั่นคือ ถ้าเรียกครั้งแรก token = a และ token = next - token (infix) ถ้าเรียกครั้งที่ 2 token = + ถ้าเรียกครั้งที่ 4 token = * ถ้าเรียกครั้งที่ 3 token = b ถ้าเรียกครั้งที่ 6 token = c

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


ดาวน์โหลด ppt โครงสร้างข้อมูลแบบสแตก (stack)

งานนำเสนอที่คล้ายกัน


Ads by Google