1 / 54

วิชา 4121205o โครงสร้างข้อมูล (Data Structure)

วิชา 4121205o โครงสร้างข้อมูล (Data Structure). โครงสร้างข้อมูลแบบ Stack. โครงสร้างข้อมูลสแตก (Stack). โครงสร้างข้อมูลแบบ Stack.

Download Presentation

วิชา 4121205o โครงสร้างข้อมูล (Data Structure)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. วิชา 4121205oโครงสร้างข้อมูล (Data Structure) โครงสร้างข้อมูลแบบ Stack

  2. โครงสร้างข้อมูลสแตก (Stack)

  3. โครงสร้างข้อมูลแบบ Stack • สแตกเป็นโครงสร้างข้อมูลแบบลิเนียร์ลิสต์(linear list) ที่สามารถนำข้อมูลเข้าหรือออกได้ทางเดียวคือส่วนบนของสแตกหรือ หรือเรียกว่า ท๊อปของสแตก (Top Of Stack) ซึ่งคุณสมบัติดังกล่าวเรียกว่า ไลโฟลิสต์ (LIFO list: Last-In-First-Out list) หรือ พูชดาวน์ลิสต์ (Pushdown List) คือสมาชิกที่เข้าลิสต์ที่หลังสุดจะได้ออกจากลิสต์ก่อน หรือ เข้าหลังออกก่อน การเพิ่มข้อมูลเข้าสแตกจะเรียกว่าพูชชิ่ง (pushing) การนำข้อมูลจากสแตกเรียกว่า ป๊อปปิ้ง (poping) การเพิ่มหรือลบข้อมูลในสแตกทำที่ท๊อปของสแตก ท๊อปของสแตกนี้เองเป็นตัวชี้สมาชิกตัวท้ายสุดของสแตก

  4. Pop คือ การนำข้อมูลออกจากส่วนบนสุดของสแตก Push คือ การนำข้อมูลใส่ลงไป ในสแตก โครงสร้างข้อมูลแบบ Stack • ตัวอย่างการทำงานแบบโครงสร้างข้อมูลแบบสแตก

  5. 5 Charter 3 ลักษณะของโครงสร้างข้อมูลสแตก (Stack) โครงสร้างของสแตก

  6. 6 Charter 3 ลักษณะของโครงสร้างข้อมูลสแตก (Stack) ลักษณะของสแตกในชีวิตประจำวัน

  7. 7 Charter 3 การแทนโครงสร้างข้อมูลสแตก (Stack) โครงสร้างข้อมูลแบบสแตกสามารถ แทนได้ด้วยโครงสร้างข้อมูลอาร์เรย์ (Array)แต่กำหนดวิธีการเข้าถึงข้อมูลในอาร์เรย์นั้นตามกฏเกณฑ์ของสแตก คือ เข้าหลังออกก่อน (Last In First Out : LIFO) ดังนั้นการเข้าถึงข้อมูลในโครงสร้างสแตกจะต้องอาศัยพอยน์เตอร์ (Pointer) ซึ่งทำหน้าที่ชี้ตำแหน่งของข้อมูลตัวสุดท้ายของสแตก

  8. 8 E Pointer D C B A Charter 3 การแทนโครงสร้างข้อมูลสแตก (Stack) โครงสร้างอาร์เรย์ (Array)

  9. 9 Stack[100] Pointer 1 2 99 100 … 1 8 … 2 8 20 … 3 8 20 6 … Charter 3 การแทนโครงสร้างข้อมูลสแตก (Stack) แสดงโครงสร้างข้อมูลสแตกด้วยอาร์เรย์ Stack[100]

  10. 10 Charter 3 การดำเนินการกับโครงสร้างข้อมูลสแตก (Stack) มีอยู่ 3 กระบวนการ คือ 1. การสร้างสแตก 2. การเพิ่มข้อมูลเข้าสแตก (Insertion หรือ Pushing) 3. การลบข้อมูลในสแตก (Deletion หรือ Popping)

  11. 11 Charter 3 ค่าที่เกี่ยวข้องกับโครงสร้างข้อมูลสแตก 1. สแตกพอยน์เตอร์ (Stack Pinter: SP) เป็นตัวชี้ข้อมูลค่าที่อยู่บนสุดของสแตก (Top of Stack) 2. พุช (Push) เป็นการกระทำเพื่อนำข้อมูลเข้าสู่สแตก เมื่อสแตกเต็มแล้ว หากมีการนำข้อมูลเข้าสู่สแตกอีกจะเกิดข้อผิดพลาดที่เรียกว่าโอเวอร์โฟลว์ (Over flow) ขึ้น 3. ป๊อบ (Pop) เป็นการกระทำเพื่อนำข้อมูลที่อยู่บนสุดออกมาจากโครงสร้างสแตก เมื่อนำข้อมูลค่าสุดท้ายออกจากสแตกแล้วจะทำให้สแตกว่างเปล่า (Empty) ได้ หากมีการ Pop ค่าข้อมูลอีกจะเกิดข้อผิดพลาดที่เรียกว่าอันเดอร์โฟลว์ (Under flow) ขึ้น

  12. 12 Push box Q onto empty stack Q A Push box A onto stack Pop box A from stack Q A Pop box Q from stack Q (Empty) Charter 3 ลักษณะการทำงานของโครงสร้างข้อมูลสแตก (Stack) Pushing and Popping a stack

  13. 13 Push box R onto empty stack R D Push box D onto stack M Push box M onto stack M D Pop box M from stack Charter 3 ลักษณะการทำงานของโครงสร้างข้อมูลสแตก (Stack) Pushing and Popping a stack (Continue)

  14. 14 Q Push box Q onto stack S Push box S onto stack Charter 3 ลักษณะการทำงานของโครงสร้างข้อมูลสแตก (Stack) Pushing and Popping a stack (Continue)

  15. 15 Charter 3 ลักษณะการทำงานของโครงสร้างข้อมูลสแตก (Stack) Stack frames for subprogram calls

  16. ตัวอย่างการทำงานของ Operation Push และ Pop Data Structure Department of Computer Science

  17. นิพจน์ทางคณิตศาสตร์ • ในการเขียนนิพจน์ทางคณิตศาสตร์เพื่อการคำนวณจะต้องคำนึงถึงลำดับความสำคัญของเครื่องหมายสำหรับการคำนวณด้วยโดยทั่วไปนิพจน์ทางคณิตศาสตร์สามารถเขียนได้ 3 รูปแบบ คือ        1.นิพจน์ Infix      นิพจน์รูปแบบนี้ operator จะอยู่ตรงกลางระหว่างตัวถูกดำเนินการ 2 ตัว เช่น A+B*C-D/E        2.นิพจน์  Postfix      นิพจน์รูปแบบนี้ จะต้องเขียนตัวถูกดำเนินการตัวที่ 1 และ 2 ก่อน แล้วตามด้วย operator เช่น ABC*+DE/-      3.นิพจน์ Prefix        นิพจน์รูปแบบนี้ จะต้องเขียน operator ก่อนแล้วตามด้วยตัวถูกดำเนินการตัวที่ 1 และ 2 เช่น - +A*BC/DE

  18. ตัวอย่างนิพจน์คณิตศาสตร์ในรูปแบบต่าง ๆ • นิพจน์ Infix นิพจน์ Postfix นิพจน์ Prefix • A+B-C AB+C- - +ABC • A+B*C-D/E ABC*+DE/- - +A*BC/DE • A*B+C-D/E AB*C+DE/- - +*ABC/DE Data Structure Department of Computer Science

  19. 19 Charter 3 การแปลงนิพจน์ Infix ให้เป็น Postfix • นิพจน์ INFIX (INFIX Notation) • หมายถึง ประโยคนิพจน์ทางด้านคณิตศาสตร์ทั่วไปที่นิยมเขียนให้รูปของ • นิพจน์ที่มีตัวดำเนินการ (Operator) อยู่ระหว่างตัวกระทำ (Operands) เช่น A+B • ข้อดี • นิพจน์เขียนอยู่ในรูปแบบทั่วไปของสมการทางคณิตศาสตร์ ทำให้เข้าใจง่าย • ข้อเสีย • ลำดับความสำคัญของเครื่องหมาย (Operator) ต่างกันทำให้เกิดความสับ • สนในการคำนวณ

  20. 20 Charter 3 การแปลงนิพจน์ Infix ให้เป็น Postfix • นิพจน์ POSTFIX (POSTFIX Notation) • หมายถึง ประโยคนิพจน์ทางด้านคณิตศาสตร์ทั่วไปที่เขียนให้รูปของนิพจน์ • ที่มีตัวดำเนินการ (Operator) อยู่หลังตัวกระทำ (Operands) ทั้งหมด เช่น AB+ • ลักษณะที่สำคัญของนิพจน์ POSTFIX คือ • 1. ตัวดำเนินการทุกตัวจะต้องอยู่หลังตัวกระทำสองตัวเสมอ • 2. ตำดำเนินการทุกตัวจะถูกวางให้อยู่ในลำดับที่ถูกต้องในการคำนวณ • 3. ไม่มีเครื่องหมายวงเล็บ ()

  21. 21 Charter 3 การแปลงนิพจน์ Infix ให้เป็น Postfix นิพจน์ POSTFIX (POSTFIX Notation) ข้อดี 1. ไม่มีปัญหาในเรื่องของความสำคัญของเครื่องหมายดำเนินการ 2. ลดปัญหาการตรวจดูลำดับการทำงานของตัวดำเนินการ ข้อเสีย 1. ทำความเข้าใจยากและสับสนกับเครื่องหมาย

  22. 22 Charter 3 การแปลงนิพจน์ Infix ให้เป็น Postfix • ขั้นตอนการแปลงนิพจน์ INFIX เป็นนิพจน์ POSTFIX มี 5 ขั้นตอน • 1. ถ้าข้อมูลเข้า (Input character) เป็นตัวกระทำ (Operand) ให้นำไป • ไว้ที่ส่วนของผลลัพธ์(POSTFIX String) ที่จัดเตรียมไว้ • 2. ถ้าข้อมูลข้าเป็นตัวดำเนินการ (Operator) ให้ทำดังนี้ • 2.1 ถ้าสแตกว่าง (Empty Stack) ให้นำตัวดำเนินการเก็บลงสู่สแตก • 2.2 ถ้าสแตกไม่ว่าง (แสดงว่ามีตัวดำเนินการอยู่ในสแตกก่อนแล้ว) • ให้เปรียบเทียบลำดับความสำคัญของของตัวดำเนินการใหม่กับตัวดำเนินการเก่า • 3. ถ้าข้อมูลเข้าเป็นเครื่องหมายวงเล็บเปิด “(“ให้นำเครื่องหมายนี้ไปเก็บ • ลงในสแตก

  23. 23 Charter 3 การแปลงนิพจน์ Infix ให้เป็น Postfix 4. ถ้าข้อมูลเข้าเป็นเครื่องหมายวงเล็บปิด “)” ให้นำตัวกระทำ (Operand) ออกจากสแตกไปต่อในส่วนที่เป็นผลลัพธ์จนกว่าจะพบเครื่องหมายวงเล็บเปิด แล้วทิ้งเครื่องหมายวงเล็บเปิดและวงเล็บปิดไป 5. ถ้าข้อมูลเข้าหมดแล้ว ให้นำตัวดำเนินการ (Operator) ออกจากสแตก ไปต่อที่ผลลัพธ์จนกว่าจะหมดตามลำดับ

  24. นิพจน์ทางคณิตศาสตร์ นิพจน์ Infix

  25. การประยุกต์ของสแตก การแปลงนิพจน์ Infix ให้เป็น Postfix ข้อเสียของนิพจน์ infix ทีทำให้คอมไพเลอร์ยุ่งยาก คือลำดับความสำคัญของโอเปอร์เรเตอร์ (Precedence) ที่ต่างกัน เช่นเครื่องหมายยกกำลัง (ใช้ ^ ในการเขียนโปรแกรม) มีความสำคัญมากกว่าเครื่องหมายคูณ และหาร และเครื่องหมายคูณและหารมีความสำคัญมากกว่าเครื่องหมายบวกและลบ • Operator คือเครื่องหมายกระทำ + - * / ^ • Operand คือตัวแปรต่าง ๆ A,B,C,D,E เช่น A+B*C,(A*B)-C

  26. การประยุกต์ของสแตก ลำดับความสำคัญ Operator • เครื่องหมายยกกำลัง ^ หรือ ** • เครื่องหมายคูณกับหาร *,/ • เครื่องหมายบวกกับลบ +,- • เครื่องหมายวงเล็บ () กระทำก่อนเช่น A+(B*C) • เครื่องหมายระดับเดียวกันไม่มีวงเล็บให้ทำจากซ้ายไปขวา เช่น A+B+C

  27. การประยุกต์ของสแตก • เมื่อการประมวลนิพจน์ infix เป็นไปด้วยความยากที่การคำนวณไม่เป็นไปตามลำดับของเครื่องหมายโอเปอร์เรเตอร์ที่มีก่อนหลัง คอมไพเลอร์จึงแปลงนิพจน์ infix ให้เป็น postfix เสียก่อน • นิพจน์ Postfix ก็คือนิพจน์ที่มีโอเปอเรเตอร์อยู่หลังโอเปอร์แรนด์ทั้งสอง เช่น AB+ หมายถึง A+B AB- หมายถึง A-B AB* หมายถึง A*B

  28. การแปลงนิพจน์ Infix ให้เป็น Postfix • เราสามารถแปลงนิพจน์Infix ให้เป็น Postfix ได้โดยอาศัยสแตคที่มีคุณสมบัติการเข้าหลังออกก่อนหรือ LIFO โดยมีอัลกอริทึมในการแปลงนิพจน์ ดังนี้พิจารณาทีละตัว - ถ้าเป็น Operand ให้ส่งไป Output - ถ้าเป็น ( ให้ Push ลง Stack - ถ้าเป็น ) ให้ Pop ไป Output จนกว่าจะเป็น ( - ถ้าเป็น Operator ให้ Pop ไป Output จนกว่า Priority จะมากกว่า Priority(StackTop) แล้วจึง Push ลง Stack เมื่อครบทุกตัวแล้วให้ Pop ไปที่ Output จนหมด

  29. การแปลงนิพจน์ Infix ให้เป็น Postfix ตัวอย่างการแปลงนิพจน์ Infix เป็นนิพจน์ Postfix นิพจน์ A + B * C

  30. ตัวอย่าง นิพจน์ (A * B) + (C / D)

  31. ตัวอย่าง นิพจน์ A / B + (C – D)

  32. ตัวอย่าง นิพจน์ (A + B) * ( C ^ D – E ) * F

  33. การแปลงนิพจน์ Infix ให้เป็น Postfix ทำด้วยมือ: 1. ใส่วงเล็บเพื่อกำหนดลำดับการประมวลผล 2. เปลี่ยน (A @ B)เป็น (A B @)ทีละวงเล็บ โดยทำจากวงเล็บในสุดก่อน 3. ดึงวงเล็บออกทั้งหมด

  34. ตัวอย่าง • นิพจน์ (A + B) * ( C ^ D – E ) * F ( ( A + B ) * ( ( C ^ D ) – E ) ) * F ( ( A B + ) * ( ( C D ^ ) – E ) ) * F ( ( A B + ) * ( C D ^ E - ) ) * F ( A B + C D ^ E - * ) * F A B + C D ^ E - * F *

  35. ตัวอย่างการแปลงนิพจน์ Infix เป็น Postfix ตัวอย่างที่2 (A + B) * C/D =(((A + B)*C)/D) =(((AB+)*C)/D) = (((AB+)C*)/D) = (((AB+)C*)D/) = AB+C*D/ ตัวอย่างที่1 A + B * C =( A + (B*C) ) = ( A + (BC*) ) = ( A (BC*)+) = A B C * +

  36. ตัวอย่างการแปลงนิพจน์ Infix เป็น Postfix การบ้าน 7-3*4/2^2+5 = A/C+(B-I)*J = (((A/C)+B)-(I*J)) = (((AC/)+B)-(IJ*)) =(((AC/)B+)-(IJ*)) =(((AC/)B+)(IJ*)-) =AC/B+IJ*- ตัวอย่างที่2 5 * 6 - 10 = ((5 * 6)- 10) = ((5 6 *)- 10) = ((5 6 *)10 -) = 5 6 * 10 -

  37. ตัวอย่างการแปลงนิพจน์ Infix เป็น Postfix ตัวอย่างที่ 3 A + B * C - D / E = ( ( A + (B*C) ) - (D/E) ) = ( ( A + (BC*) ) - (DE/) ) = ( ( A (BC*) +) (DE/) -) = A B C * + D E / -

  38. การบ้าน (7-3)*4/2^2+5-9*3 = A/C+(B-I)*J = ………= …………….. =AC/B+IJ*-

  39. ขั้นตอนการคำนวณจากนิพจน์ Postfix ในการคำนวณค่า Postfix ที่แปลงมาแล้ว ตัวแปลภาษาจะทำ การคำนวณโดยใช้โครงสร้างสแตกช่วยอีกเช่นกัน ขั้นตอนในการคำนวณ 1. อ่านตัวอักษรในนิพจน์ Postfix จากซ้ายไปขวาทีละ ตัวอักษร 2. ถ้าเป็นตัวถูกดำเนินการ ให้ทำการ push ตัวถูกดำเนินการ นั้นลงในสแตก แล้วกลับไปอ่านอักษรตัวใหม่เข้ามา 3. ถ้าเป็นตัวดำเนินการ ให้ทำการ pop ค่าจากสแตก 2 ค่า โดย ตัวแรกเป็นตัวถูกดำเนินการตัวที่ 2 และตัวที่ 1 ตามลำดับ Department of Computer Science Data Structure

  40. ขั้นตอนการคำนวณจากนิพจน์ Postfix 4. ทำการคำนวณ ตัวถูกดำเนินการตัวที่ 1 ด้วยตัวถูก ดำเนินการตัวที่ 2 โดยใช้ตัวดำเนินการในข้อ 3 5. ทำการ push ผลลัพธ์ที่ได้จากการคำนวณในข้อ 4 ลงสแตก 6. ถ้าตัวอักษรในนิพจน์ Postfix ยังอ่านไม่หมดให้กลับไปทำ ข้อ 1 ใหม่ Data Structure Department of Computer Science

  41. ขั้นตอนการคำนวณจากนิพจน์ Postfix ตัวอย่าง ขั้นตอนการคำนวณจากนิพจน์ Postfix ABC+D-*E/ 2. ABC+D-*E/ 1. ABC+D-*E/ Push B Push A B A A Data Structure Department of Computer Science

  42. ขั้นตอนการคำนวณจากนิพจน์ Postfix 4. ABC+D-*E/ 3. ABC+D-*E/ Push C 1. Pop C 2. Pop B 3. B+C 4. Push B+C C B+C B A A Data Structure Department of Computer Science

  43. ขั้นตอนการคำนวณจากนิพจน์ Postfix 6. ABC+D-*E/ 5. ABC+D-*E/ Push D 1. Pop D 2. Pop B+C 3. B+C-D 4. Push B+C-D D B+C-D B+C A A Data Structure Department of Computer Science

  44. ขั้นตอนการคำนวณจากนิพจน์ Postfix 8. ABC+D-*E/ 7. ABC+D-*E/ 1. Pop B+C-D 2. Pop A 3. A*B+C-D 4. Push A*B+C-D Push E E A*B+C-D A*B+C-D Data Structure Department of Computer Science

  45. ขั้นตอนการคำนวณจากนิพจน์ Postfix 9. ABC+D-*E/ 1. Pop E 2. Pop A*B+C-D 3. A*B+C-D/E 4. Push A*B+C-D/E A*B+C-D/E 10. ค่าสุดท้ายที่อยู่ในสแตกคือคำตอบที่ต้องการ Data Structure Department of Computer Science

  46. Data Structure Department of Computer Science

  47. Data Structure Department of Computer Science

  48. ตัวอย่าง การคำนวณหาค่า ของนิพจน์ Postfix

  49. แบบฝึกหัด จงแปลงนิพจน์ Infix ต่อไปนี้ให้อยู่ในรูปแบบ Postfix 1. D - B + C 2. A * B + C * D • (A+B) * C - D * F + C • (A-2*(B+C)-D*E)*F • (A+B)*C+D+E*F-G

More Related