270 likes | 669 Views
Chapter 3 - Stack, - Queue,- Infix Prefix Postfix. WATTANAPONG SUTTAPAK Software Engineering, School of Information Communication Technology, University of PHAYAO. จุดประสงค์ บทเรียนที่ 3. เข้าใจถึงความหมายและประโยชน์ของ stack
E N D
Chapter 3- Stack, - Queue,- Infix Prefix Postfix WATTANAPONGSUTTAPAK Software Engineering, School of Information Communication Technology, University of PHAYAO
จุดประสงค์ บทเรียนที่ 3 เข้าใจถึงความหมายและประโยชน์ของ stack สามารถนำความรู้เรื่อง stack ไปใช้แก้ปัญหาทางคอมพิวเตอร์ได้ เข้าใจถึงความหมายและประโยชน์ของ queue สามารถนำความรู้เรื่อง queueไปใช้แก้ปัญหาทางคอมพิวเตอร์ได้ เข้าใจถึงหลักการ prefix infix postfix ได้ สามารถเขียนโปรแกรมเพื่อแปลงค่าสลับระหว่าง prefix infix postfix ได้
Stack • ชื่อภาษาไทยกองซ้อน[4] • หลักการทำงานของ stack คือ LIFO(last in first out) • ตัวอย่างการประยุกต์ใช้ stack • การแปลงนิพจน์คำนวณของคอมพิวเตอร์ • การคำนวณค่าจาก function recursion ของคอมพิวเตอร์ • การแก้ปัญหาทางคอมพิวเตอร์อื่นๆ เช่น tower of hanoi • stack สร้างขึ้นมาเพื่อช่วยให้การแก้ปัญหาทางคอมพิวเตอร์ง่ายขึ้น
Stack 3 2 1 Last in First out การทำงานของ stack คือ เข้าก่อนออกทีหลัง หรือ เข้าทีหลังออกก่อน
Stack • Exercise 1 • สร้าง class stack ด้วย Array หรือ ArrayListให้ตั้งชื่อ class ว่าMyStack • โดยกำหนดให้ method push() เพิ่ม item • method pop() ดึง item ออก • กำหนดให้ข้อมูลเป็นดังนี้ • push(0) push(1) push(1) push(2) push(3) push(4) • pop() push(5) push(6) pop() push(7) pop() push(8) • print ค่า array ทั้งหมดใน stack • จะต้องได้ 0 1 1 2 3 5 8
Stack • Exercise 2 • ให้ใช้ class Stack • โดยกำหนดให้ method push() เพิ่ม item • method pop() ดึง item ออก • กำหนดให้ข้อมูลเป็นดังนี้ • push(0) push(1) push(1) push(2) push(3) push(4) • pop() push(5) push(6) pop() push(7) pop() push(8) • print ค่า array ทั้งหมดใน stack • จะต้องได้ 0 1 1 2 3 5 8
Queue • ชื่อภาษาไทยแถวคอย [4] • หลักการทำงานของ queue คือ FIFO(first in first out) • ตัวอย่างการทำงานของ queue • การเก็บสถานการณ์พิมพ์ของเครื่องพิมพ์ • การเข้าคิวต่างๆ เช่น ซื้ออาหาร ซื้อตั๋วหนัง เข้าคิวธนาคาร
Queue 3 2 1 FIFO (First in First out) การเข้าออกเป็นไปตามลำดับก่อนหลัง นั่นคือ เข้าก่อนออกก่อน เข้าหลังออกหลัง
Queue • Exercise 3 • สร้าง class queue ด้วย Array หรือ ArrayListให้ตั้งชื่อ class ว่าMyQueue • โดยกำหนดให้ method enqueue() เพิ่ม item • method dequeue() ดึง item ออก • กำหนดให้ข้อมูลเป็นดังนี้ • enqueue(10) enqueue(8) enqueue(1) enqueue(2) enqueue(3) • dequeue() enqueue(4) dequeue() enqueue(5) • จะต้องได้ 1 2 3 4 5
infix prefix postfix • infix notation หมายถึง รูปแบบการเขียนตัวเลขและเครื่องหมายในรูปแบบปกติ เช่น (a+b)*(c-d) หรือ (3+5)*(4-3) • prefix notation(Polish notation) หมายถึงรูปแบบการเขียนตัวเลขและเครื่องหมายในรูปแบบให้เครื่องหมายอยู่ด้านหน้าตัวเลข เช่น *+ab-cd หรือ *+35-43 • postfix notation(Reverse Polish notation) หมายถึงรูปแบบการเขียนตัวเลขและเครื่องหมายในรูปแบบให้เครื่องหมายอยู่ด้านหลังตัวเลข เช่น ab+cd-* หรือ 35+43-*
prefix? postfix? แล้วจะกลับเครื่องหมายไปหน้าไปหลังทำไม ? • infix เป็นรูปแบบที่มนุษย์ใช้อ่านและคิดคำนวณ • แต่สำหรับคอมพิวเตอร์ รูปแบบที่ง่ายคือ prefix และ postfix
prefix (5*6)+7 = 5*6+7 infix -> prefix เริ่มจากความสำคัญสูงสุดนั่นคือ 5*6 นำเครื่องหมายมาด้านหน้าตัวเลขจะได้เป็น *56 ให้ *56 = x จะได้ x + 7 นำเครื่องหมายไว้ด้านหน้าจะได้เป็น +x7 แทนค่า x ด้วย *56 จะได้ +*567 เป็นคำตอบ คำตอบคือ +*567
prefix 5*6+7 infix -> prefixby Stack วิธีการจะเริ่มจากด้านซ้ายไปขวาโดยให้ความสำคัญของเครื่องหมายสูงสุดก่อน + * 6 7 5
prefix +*567 prefix ->infix เริ่มจากด้านซ้ายไปขวา หาเครื่องหมายที่ตามด้วยตัวเลขสองตัว นั่นคือ *56 นำเครื่องหมายมาไว้ตรงกลางจะได้ 5*6 แทนค่า 5*6 ด้วย x จะได้ +x7 นำเครื่องหมายมาไว้ตรงกลางจะได้ x+7 แทนค่า x ด้วย 5*6 จะได้ 5*6+7 คำตอบคือ 5*6+7
prefix +*567 prefix ->infixby Stack วิธีการจะเริ่มจากด้านขวาไปซ้าย(หลังไปหน้า) 6 5 7 * +
prefix +*567 prefix ->infixby stack วิธีการจะเริ่มจากด้านขวาไปซ้าย(หลังไปหน้า) 37 30 + 7
postfix (5*6)+7 = 5*6+7 infix -> postfix เริ่มจากความสำคัญสูงสุดนั่นคือ 5*6 นำเครื่องหมายมาด้านหลังตัวเลขจะได้เป็น 56* ให้ 56* = x จะได้ x + 7 นำเครื่องหมายไว้ด้านหลังจะได้เป็น x7 + แทนค่า x ด้วย 56* จะได้ 56*7+เป็นคำตอบ คำตอบคือ 56*7+
prefix 5*6+7 infix ->postfixby Stack วิธีการจะเริ่มจากด้านซ้ายไปขวาโดยให้ความสำคัญของเครื่องหมายสูงสุดก่อน + * 6 7 5
postfix 56*7+ postfix ->infix เริ่มจากด้านซ้ายไปขวา หาตัวเลขสองตัวและมีเครื่องด้านหลัง นั่นคือ 56* นำเครื่องหมายมาไว้ตรงกลางจะได้ 5*6 แทนค่า 5*6 ด้วย x จะได้ x7+ นำเครื่องหมายมาไว้ตรงกลางจะได้ x+7 แทนค่า x ด้วย 5*6 จะได้ 5*6+7 คำตอบคือ 5*6+7
postfix 56*7+ postfix ->infixby Stack วิธีการจะเริ่มจากด้านซ้ายไปขวา(หน้าไปหลัง) 30 5 6 * + 7
postfix 56*7+ postfix ->infixby Stack วิธีการจะเริ่มจากด้านซ้ายไปขวา(หน้าไปหลัง) 37 30 + 7
prefix postfix จากตัวอย่างทั้ง prefix และ postfix จะเห็นว่าเมื่อตัวเลขที่มีจำนวนหลักมากกว่า 2 หลัก(มากกว่าหรือเท่ากับ 10)จะทำให้การแปลงกับจาก prefix(postfix) ไปเป็น infix มีความผิดพลาดเช่น 27*6+5 แปลงเป็น postfix จะได้ 276*5+ และ 2*76+5 แปลงเป็น postfix จะได้ 276*5+ จะเห็นว่า postfix ของทั้งสองค่าเหมือนกัน ดังนั้นในกรณี infix มีจำนวนใดจำนวนหนึ่งมีค่าตั้งแต่ 10 ขึ้นไป ให้ใส่เป็นเครื่องหมาย , คั่นในแต่ละเครื่องหมายและตัวเลขเช่น 27*6+5-> 27,6,*,5,+ 2*76+5 -> 2,76,*,5,+
Exercise 4 แปลงค่า infix ต่อไปนี้เป็น prefix และ postfix (A + B) * C + D / (E + F * G) – H ! (A && ! ((B < C) || (C > D))) || (C < E) A - B - C * (D + E / F - G) – H เฉลย postfix: A B + C * D E F G * + / + H - prefix: - + * + A B C / D + E * F G H postfix: A B C < C D > || ! && ! C E < || prefix: || ! && A ! || < B C > C D < C E postfix: A B - C D E F / + G - * - H - prefix: - - - A B * C - + D / E F G H
Exercise 5 แปลงค่า postfix ต่อไปนี้เป็น infix จากนั้นแปลงเป็น prefix A B && C || E F > ! || A B C D * - E / + F + G H / - เฉลย infix: (A && B) || C || ! (E > F) prefix: || || && A B C ! > E F infix: A + ((B - C * D) / E ) + F - G / H prefix: - + + A / - B * C D E F / G H
Exercise 6 Exercise 6 แปลงค่า prefix ต่อไปนี้เป็น infix จากนั้นแปลงเป็น postfix - / + * A B C D / E + F G เฉลย infix: (A * B + C) / D - E / (F + G) postfix: A B * C + D / E F G + / -
Exercise 7 แก้ปัญหา Exercise 4 5 และ 6 โดยใช้ Stack