550 likes | 924 Views
วิชา 4121205o โครงสร้างข้อมูล (Data Structure). โครงสร้างข้อมูลแบบ Stack. โครงสร้างข้อมูลสแตก (Stack). โครงสร้างข้อมูลแบบ Stack.
E N D
วิชา 4121205oโครงสร้างข้อมูล (Data Structure) โครงสร้างข้อมูลแบบ Stack
โครงสร้างข้อมูลสแตก (Stack)
โครงสร้างข้อมูลแบบ Stack • สแตกเป็นโครงสร้างข้อมูลแบบลิเนียร์ลิสต์(linear list) ที่สามารถนำข้อมูลเข้าหรือออกได้ทางเดียวคือส่วนบนของสแตกหรือ หรือเรียกว่า ท๊อปของสแตก (Top Of Stack) ซึ่งคุณสมบัติดังกล่าวเรียกว่า ไลโฟลิสต์ (LIFO list: Last-In-First-Out list) หรือ พูชดาวน์ลิสต์ (Pushdown List) คือสมาชิกที่เข้าลิสต์ที่หลังสุดจะได้ออกจากลิสต์ก่อน หรือ เข้าหลังออกก่อน การเพิ่มข้อมูลเข้าสแตกจะเรียกว่าพูชชิ่ง (pushing) การนำข้อมูลจากสแตกเรียกว่า ป๊อปปิ้ง (poping) การเพิ่มหรือลบข้อมูลในสแตกทำที่ท๊อปของสแตก ท๊อปของสแตกนี้เองเป็นตัวชี้สมาชิกตัวท้ายสุดของสแตก
Pop คือ การนำข้อมูลออกจากส่วนบนสุดของสแตก Push คือ การนำข้อมูลใส่ลงไป ในสแตก โครงสร้างข้อมูลแบบ Stack • ตัวอย่างการทำงานแบบโครงสร้างข้อมูลแบบสแตก
5 Charter 3 ลักษณะของโครงสร้างข้อมูลสแตก (Stack) โครงสร้างของสแตก
6 Charter 3 ลักษณะของโครงสร้างข้อมูลสแตก (Stack) ลักษณะของสแตกในชีวิตประจำวัน
7 Charter 3 การแทนโครงสร้างข้อมูลสแตก (Stack) โครงสร้างข้อมูลแบบสแตกสามารถ แทนได้ด้วยโครงสร้างข้อมูลอาร์เรย์ (Array)แต่กำหนดวิธีการเข้าถึงข้อมูลในอาร์เรย์นั้นตามกฏเกณฑ์ของสแตก คือ เข้าหลังออกก่อน (Last In First Out : LIFO) ดังนั้นการเข้าถึงข้อมูลในโครงสร้างสแตกจะต้องอาศัยพอยน์เตอร์ (Pointer) ซึ่งทำหน้าที่ชี้ตำแหน่งของข้อมูลตัวสุดท้ายของสแตก
8 E Pointer D C B A Charter 3 การแทนโครงสร้างข้อมูลสแตก (Stack) โครงสร้างอาร์เรย์ (Array)
9 Stack[100] Pointer 1 2 99 100 … 1 8 … 2 8 20 … 3 8 20 6 … Charter 3 การแทนโครงสร้างข้อมูลสแตก (Stack) แสดงโครงสร้างข้อมูลสแตกด้วยอาร์เรย์ Stack[100]
10 Charter 3 การดำเนินการกับโครงสร้างข้อมูลสแตก (Stack) มีอยู่ 3 กระบวนการ คือ 1. การสร้างสแตก 2. การเพิ่มข้อมูลเข้าสแตก (Insertion หรือ Pushing) 3. การลบข้อมูลในสแตก (Deletion หรือ Popping)
11 Charter 3 ค่าที่เกี่ยวข้องกับโครงสร้างข้อมูลสแตก 1. สแตกพอยน์เตอร์ (Stack Pinter: SP) เป็นตัวชี้ข้อมูลค่าที่อยู่บนสุดของสแตก (Top of Stack) 2. พุช (Push) เป็นการกระทำเพื่อนำข้อมูลเข้าสู่สแตก เมื่อสแตกเต็มแล้ว หากมีการนำข้อมูลเข้าสู่สแตกอีกจะเกิดข้อผิดพลาดที่เรียกว่าโอเวอร์โฟลว์ (Over flow) ขึ้น 3. ป๊อบ (Pop) เป็นการกระทำเพื่อนำข้อมูลที่อยู่บนสุดออกมาจากโครงสร้างสแตก เมื่อนำข้อมูลค่าสุดท้ายออกจากสแตกแล้วจะทำให้สแตกว่างเปล่า (Empty) ได้ หากมีการ Pop ค่าข้อมูลอีกจะเกิดข้อผิดพลาดที่เรียกว่าอันเดอร์โฟลว์ (Under flow) ขึ้น
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 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 Q Push box Q onto stack S Push box S onto stack Charter 3 ลักษณะการทำงานของโครงสร้างข้อมูลสแตก (Stack) Pushing and Popping a stack (Continue)
15 Charter 3 ลักษณะการทำงานของโครงสร้างข้อมูลสแตก (Stack) Stack frames for subprogram calls
ตัวอย่างการทำงานของ Operation Push และ Pop Data Structure Department of Computer Science
นิพจน์ทางคณิตศาสตร์ • ในการเขียนนิพจน์ทางคณิตศาสตร์เพื่อการคำนวณจะต้องคำนึงถึงลำดับความสำคัญของเครื่องหมายสำหรับการคำนวณด้วยโดยทั่วไปนิพจน์ทางคณิตศาสตร์สามารถเขียนได้ 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
ตัวอย่างนิพจน์คณิตศาสตร์ในรูปแบบต่าง ๆ • นิพจน์ 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 Charter 3 การแปลงนิพจน์ Infix ให้เป็น Postfix • นิพจน์ INFIX (INFIX Notation) • หมายถึง ประโยคนิพจน์ทางด้านคณิตศาสตร์ทั่วไปที่นิยมเขียนให้รูปของ • นิพจน์ที่มีตัวดำเนินการ (Operator) อยู่ระหว่างตัวกระทำ (Operands) เช่น A+B • ข้อดี • นิพจน์เขียนอยู่ในรูปแบบทั่วไปของสมการทางคณิตศาสตร์ ทำให้เข้าใจง่าย • ข้อเสีย • ลำดับความสำคัญของเครื่องหมาย (Operator) ต่างกันทำให้เกิดความสับ • สนในการคำนวณ
20 Charter 3 การแปลงนิพจน์ Infix ให้เป็น Postfix • นิพจน์ POSTFIX (POSTFIX Notation) • หมายถึง ประโยคนิพจน์ทางด้านคณิตศาสตร์ทั่วไปที่เขียนให้รูปของนิพจน์ • ที่มีตัวดำเนินการ (Operator) อยู่หลังตัวกระทำ (Operands) ทั้งหมด เช่น AB+ • ลักษณะที่สำคัญของนิพจน์ POSTFIX คือ • 1. ตัวดำเนินการทุกตัวจะต้องอยู่หลังตัวกระทำสองตัวเสมอ • 2. ตำดำเนินการทุกตัวจะถูกวางให้อยู่ในลำดับที่ถูกต้องในการคำนวณ • 3. ไม่มีเครื่องหมายวงเล็บ ()
21 Charter 3 การแปลงนิพจน์ Infix ให้เป็น Postfix นิพจน์ POSTFIX (POSTFIX Notation) ข้อดี 1. ไม่มีปัญหาในเรื่องของความสำคัญของเครื่องหมายดำเนินการ 2. ลดปัญหาการตรวจดูลำดับการทำงานของตัวดำเนินการ ข้อเสีย 1. ทำความเข้าใจยากและสับสนกับเครื่องหมาย
22 Charter 3 การแปลงนิพจน์ Infix ให้เป็น Postfix • ขั้นตอนการแปลงนิพจน์ INFIX เป็นนิพจน์ POSTFIX มี 5 ขั้นตอน • 1. ถ้าข้อมูลเข้า (Input character) เป็นตัวกระทำ (Operand) ให้นำไป • ไว้ที่ส่วนของผลลัพธ์(POSTFIX String) ที่จัดเตรียมไว้ • 2. ถ้าข้อมูลข้าเป็นตัวดำเนินการ (Operator) ให้ทำดังนี้ • 2.1 ถ้าสแตกว่าง (Empty Stack) ให้นำตัวดำเนินการเก็บลงสู่สแตก • 2.2 ถ้าสแตกไม่ว่าง (แสดงว่ามีตัวดำเนินการอยู่ในสแตกก่อนแล้ว) • ให้เปรียบเทียบลำดับความสำคัญของของตัวดำเนินการใหม่กับตัวดำเนินการเก่า • 3. ถ้าข้อมูลเข้าเป็นเครื่องหมายวงเล็บเปิด “(“ให้นำเครื่องหมายนี้ไปเก็บ • ลงในสแตก
23 Charter 3 การแปลงนิพจน์ Infix ให้เป็น Postfix 4. ถ้าข้อมูลเข้าเป็นเครื่องหมายวงเล็บปิด “)” ให้นำตัวกระทำ (Operand) ออกจากสแตกไปต่อในส่วนที่เป็นผลลัพธ์จนกว่าจะพบเครื่องหมายวงเล็บเปิด แล้วทิ้งเครื่องหมายวงเล็บเปิดและวงเล็บปิดไป 5. ถ้าข้อมูลเข้าหมดแล้ว ให้นำตัวดำเนินการ (Operator) ออกจากสแตก ไปต่อที่ผลลัพธ์จนกว่าจะหมดตามลำดับ
นิพจน์ทางคณิตศาสตร์ นิพจน์ Infix
การประยุกต์ของสแตก การแปลงนิพจน์ Infix ให้เป็น Postfix ข้อเสียของนิพจน์ infix ทีทำให้คอมไพเลอร์ยุ่งยาก คือลำดับความสำคัญของโอเปอร์เรเตอร์ (Precedence) ที่ต่างกัน เช่นเครื่องหมายยกกำลัง (ใช้ ^ ในการเขียนโปรแกรม) มีความสำคัญมากกว่าเครื่องหมายคูณ และหาร และเครื่องหมายคูณและหารมีความสำคัญมากกว่าเครื่องหมายบวกและลบ • Operator คือเครื่องหมายกระทำ + - * / ^ • Operand คือตัวแปรต่าง ๆ A,B,C,D,E เช่น A+B*C,(A*B)-C
การประยุกต์ของสแตก ลำดับความสำคัญ Operator • เครื่องหมายยกกำลัง ^ หรือ ** • เครื่องหมายคูณกับหาร *,/ • เครื่องหมายบวกกับลบ +,- • เครื่องหมายวงเล็บ () กระทำก่อนเช่น A+(B*C) • เครื่องหมายระดับเดียวกันไม่มีวงเล็บให้ทำจากซ้ายไปขวา เช่น A+B+C
การประยุกต์ของสแตก • เมื่อการประมวลนิพจน์ infix เป็นไปด้วยความยากที่การคำนวณไม่เป็นไปตามลำดับของเครื่องหมายโอเปอร์เรเตอร์ที่มีก่อนหลัง คอมไพเลอร์จึงแปลงนิพจน์ infix ให้เป็น postfix เสียก่อน • นิพจน์ Postfix ก็คือนิพจน์ที่มีโอเปอเรเตอร์อยู่หลังโอเปอร์แรนด์ทั้งสอง เช่น AB+ หมายถึง A+B AB- หมายถึง A-B AB* หมายถึง A*B
การแปลงนิพจน์ Infix ให้เป็น Postfix • เราสามารถแปลงนิพจน์Infix ให้เป็น Postfix ได้โดยอาศัยสแตคที่มีคุณสมบัติการเข้าหลังออกก่อนหรือ LIFO โดยมีอัลกอริทึมในการแปลงนิพจน์ ดังนี้พิจารณาทีละตัว - ถ้าเป็น Operand ให้ส่งไป Output - ถ้าเป็น ( ให้ Push ลง Stack - ถ้าเป็น ) ให้ Pop ไป Output จนกว่าจะเป็น ( - ถ้าเป็น Operator ให้ Pop ไป Output จนกว่า Priority จะมากกว่า Priority(StackTop) แล้วจึง Push ลง Stack เมื่อครบทุกตัวแล้วให้ Pop ไปที่ Output จนหมด
การแปลงนิพจน์ Infix ให้เป็น Postfix ตัวอย่างการแปลงนิพจน์ Infix เป็นนิพจน์ Postfix นิพจน์ A + B * C
ตัวอย่าง นิพจน์ (A * B) + (C / D)
ตัวอย่าง นิพจน์ A / B + (C – D)
ตัวอย่าง นิพจน์ (A + B) * ( C ^ D – E ) * F
การแปลงนิพจน์ Infix ให้เป็น Postfix ทำด้วยมือ: 1. ใส่วงเล็บเพื่อกำหนดลำดับการประมวลผล 2. เปลี่ยน (A @ B)เป็น (A B @)ทีละวงเล็บ โดยทำจากวงเล็บในสุดก่อน 3. ดึงวงเล็บออกทั้งหมด
ตัวอย่าง • นิพจน์ (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 *
ตัวอย่างการแปลงนิพจน์ 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 * +
ตัวอย่างการแปลงนิพจน์ 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 -
ตัวอย่างการแปลงนิพจน์ Infix เป็น Postfix ตัวอย่างที่ 3 A + B * C - D / E = ( ( A + (B*C) ) - (D/E) ) = ( ( A + (BC*) ) - (DE/) ) = ( ( A (BC*) +) (DE/) -) = A B C * + D E / -
การบ้าน (7-3)*4/2^2+5-9*3 = A/C+(B-I)*J = ………= …………….. =AC/B+IJ*-
ขั้นตอนการคำนวณจากนิพจน์ Postfix ในการคำนวณค่า Postfix ที่แปลงมาแล้ว ตัวแปลภาษาจะทำ การคำนวณโดยใช้โครงสร้างสแตกช่วยอีกเช่นกัน ขั้นตอนในการคำนวณ 1. อ่านตัวอักษรในนิพจน์ Postfix จากซ้ายไปขวาทีละ ตัวอักษร 2. ถ้าเป็นตัวถูกดำเนินการ ให้ทำการ push ตัวถูกดำเนินการ นั้นลงในสแตก แล้วกลับไปอ่านอักษรตัวใหม่เข้ามา 3. ถ้าเป็นตัวดำเนินการ ให้ทำการ pop ค่าจากสแตก 2 ค่า โดย ตัวแรกเป็นตัวถูกดำเนินการตัวที่ 2 และตัวที่ 1 ตามลำดับ Department of Computer Science Data Structure
ขั้นตอนการคำนวณจากนิพจน์ Postfix 4. ทำการคำนวณ ตัวถูกดำเนินการตัวที่ 1 ด้วยตัวถูก ดำเนินการตัวที่ 2 โดยใช้ตัวดำเนินการในข้อ 3 5. ทำการ push ผลลัพธ์ที่ได้จากการคำนวณในข้อ 4 ลงสแตก 6. ถ้าตัวอักษรในนิพจน์ Postfix ยังอ่านไม่หมดให้กลับไปทำ ข้อ 1 ใหม่ Data Structure Department of Computer Science
ขั้นตอนการคำนวณจากนิพจน์ 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
ขั้นตอนการคำนวณจากนิพจน์ 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
ขั้นตอนการคำนวณจากนิพจน์ 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
ขั้นตอนการคำนวณจากนิพจน์ 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
ขั้นตอนการคำนวณจากนิพจน์ 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
Data Structure Department of Computer Science
Data Structure Department of Computer Science
ตัวอย่าง การคำนวณหาค่า ของนิพจน์ Postfix
แบบฝึกหัด จงแปลงนิพจน์ 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