รูปแบบนิพจน์คำนวน

รูปแบบนิพจน์คำนวน

การคำนวณนิพจน์คณิตศาสตร์  การเขียนนิพจน์คณิตศาสตร์เพื่อการคำนวณจะต้องคำนึงถึงลำดับความสำคัญของเครื่องหมายสำหรับการคำนวณด้วย   โดยทั่วไปนิพจน์คณิตศาสตร์สามารถเขียนได้  3  รูปแบบดังนี้

                         .  นิพจน์อินฟิกซ์ (infix expression)     การเขียนนิพจน์ด้วยรูปแบบนี้    ตัวดำเนินการ (operator)   อยู่ตรงกลางระหว่างตัวถูกดำเนินการ (operand) 2 ตัว 

                         .  นิพจน์โพสฟิกซ์ (postfix  expression)     เป็นการเขียนนิพจน์ที่จะต้องเขียนตัวถูกดำเนินการตัวที่ 1  และตัวถูกดำเนินการตัวที่ 2  ก่อน  ตามด้วยตัวดำเนินการ

                         .  นิพจน์พรีฟิกซ์ (prefix  expression)    เป็นการเขียนนิพจน์ที่จะต้องเขียนตัวดำเนินการก่อนแล้วตามด้วย    ตัวถูกดำเนินการตัวที่  1    และตัวถูกดำเนินการตัวที่  2  ตามลำดับ 

                         ตัวอย่างนิพจน์คณิตศาสตร์  ในรูปแบบต่าง ๆ ดังนี้

  Loading image...

                         ในการเขียนโปรแกรมคอมพิวเตอร์ด้วยภาษาระดับสูงคำสั่งที่เป็นนิพจน์คณิตศาสตร์จะเขียนอยู่ในรูปแบบของนิพจน์อินฟิกซ์     นั่นคือเครื่องหมายคำนวณจะอยู่ตรงกลางระหว่างตัวแปรหรือค่าที่จะถูกนำมาคำนวณด้วย   การคำนวณค่าในนิพจน์รูปแบบนี้   ตัวแปลภาษาต้องทำการตรวจสอบนิพจน์จากซ้ายไปขวา    เพื่อหาเครื่องหมายหรือตัวดำเนินการที่ต้องคำนวณก่อน    จึงจะเริ่มคำนวณให้   แล้วทำแบบนี้ซ้ำ ๆ กันจนกว่าจะคำนวณเครื่องหมายครบทุกตัว   ซึ่งการทำงานค่อนข้างช้าและไม่สะดวกในการคำนวณ

                         ดังนั้นเพื่อแก้ปัญหานี้   การแปลคำสั่งที่เป็นการคำนวณนิพจน์คณิตศาสตร์      ตัวแปลภาษาจะทำการแปลงนิพจน์อินฟิกซ์ให้อยู่ในรูปแบบที่ช่วยให้การคำนวณนิพจน์สะดวกและรวดเร็วขึ้น   โดยแปลงให้อยู่ในรูปแบบของนิพจน์โพสฟิกซ์   ซึ่งตัวดำเนินการอยู่ข้างหลังตัวถูกดำเนินการทั้งสองเสมอ

                         สำหรับแนวคิดในการเขียนโปรแกรมเพื่อเปลี่ยนนิพจน์อินฟิกซ์ไปเป็นนิพจน์    โพสฟิกซ์ของตัวแปลภาษา    ใช้เทคนิคของการจัดเก็บข้อมูลในโครงสร้างสแตกเข้ามาช่วย     โดยการพิจารณานิพจน์อินฟิกซ์ทีละตัวอักษรจากซ้ายไปขวา   และย้ายตัวอักษรเหล่านั้นไปเป็นตัวอักษรในนิพจน์โพสฟิกซ์ทีละตัว   ส่วนตัวดำเนินการจะถูกนำไปเก็บไว้ในสแตก    โดยกำหนดค่าของตัวดำเนินการ   วงเล็บเปิด  และวงเล็บปิด    ดังแสดงในตารางที่ 6.1

Loading image...

ขั้นตอนวิธีในการเขียนโปรแกรมแปลงนิพจน์อินฟิกซ์ไปเป็นนิพจน์โพสฟิกซ์

                         (1)  อ่านตัวอักขระในนิพจน์อินฟิกซ์เข้ามาทีละตัว

                         (2)   ถ้าเป็นตัวถูกดำเนินการ จะถูกย้ายไปเป็นตัวอักษรในนิพจน์โพสฟิกซ์

                         (3) ถ้าเป็นตัวดำเนินการจะนำค่าลำดับความสำคัญของตัวดำเนินการที่อ่านเข้ามาในขณะนั้นไปเปรียบเทียบกับค่าลำดับความสำคัญของตัวดำเนินการที่อยู่บนสุดใน สแตก   ดังนี้

                                   -  ถ้ามีความสำคัญมากกว่า จะถูกพุชลงในสแตก

                                   -  ถ้ามีความสำคัญน้อยกว่าหรือเท่ากัน จะต้องทำการพ็อปตัวดำเนินการที่อยู่ในสแตกขณะนั้นไปเรียงต่อกับตัวอักษรในนิพจน์โพสฟิกซ์

                         (4)  ตัวดำเนินการที่เป็นวงเล็บปิด “)” จะไม่พุชลงในสแตก    แต่มีผลให้ตัวดำเนินการอื่น ๆ ถูกพ็อปออกจากสแตกนำไปเรียงต่อกันในนิพจน์โพสฟิกซ์ จนกระทั่งเจอตัวดำเนินการวงเล็บเปิด “(”   จะพ็อปวงเล็บเปิดออกจากสแตกแต่ไม่นำไปเรียงต่อ

                         (5) เมื่อทำการอ่านตัวอักษรในนิพจน์อินฟิกซ์หมดแล้วให้ทำการพ็อปตัวดำเนินการทุกตัวในสแตกนำมาเรียงต่อในนิพจน์โพสฟิกซ์ จะได้นิพจน์โพสฟิกซ์ตามที่ต้องการ

ตัวอย่าง  ขั้นตอนแสดงการแปลงนิพจน์อินฟิกซ์  A-B/C+D*E   ไปเป็นนิพจน์โพสฟิกซ์ ดังนี้

Loading image...

ตัวอย่าง  ขั้นตอนแสดงการแปลงนิพจน์อินฟิกซ์  A*(B+C-D)/E ไปเป็นนิพจน์โพสฟิกซ์   ดังนี้

                   Loading image...

                    ในการคำนวณค่านิพจน์โพสฟิกซ์ที่แปลงมาเรียบร้อยแล้ว   ตัวแปลภาษาจะทำการคำนวณโดยใช้โครงสร้างสแตกช่วยอีกเช่นกัน ซึ่งวิธีการคำนวณค่ามีลำดับขั้นตอนดังต่อไปนี้ 

                   (1)  อ่านตัวอักษรในนิพจน์โพสฟิกซ์จากซ้ายไปขวาทีละตัวอักษร แล้วทำข้อ 2  

                   (2)  ถ้าเป็นตัวถูกดำเนินการ ให้ทำการพุชตัวถูกดำเนินการนั้นลงในสแตก   แล้วกลับไปอ่านตัวอักษรใหม่เข้ามา ในข้อ 1

                   (3)  ถ้าเป็นตัวดำเนินการ ให้ทำการพ็อปค่าจากสแตก 2 ค่า   โดยตัวแรกเป็นตัวถูกดำเนินการตัวที่ 2   และตัวต่อมาเป็นตัวถูกดำเนินการตัวที่ 1

                   (4)  ทำการคำนวณ ตัวถูกดำเนินการที่ 1 ด้วย   ตัวถูกดำเนินการที่ 2    โดยใช้ตัวดำเนินการในข้อ 3

                   (5)  ทำการพุชผลลัพธ์ที่ได้จากการคำนวณในข้อ 4 ลงในสแตก

                   (6)  ถ้าตัวอักษรในนิพจน์โพสฟิกซ์ยังอ่านไม่หมดให้กลับไปทำข้อ1 ถ้าหมดแล้วจบการทำงาน

ตัวอย่าง  ขั้นตอนแสดงการคำนวณค่านิพจน์อินฟิกซ์  A * (B+C-D) / E   จากนิพจน์โพสฟิกซ์   ABC+D-*E/ โดยใช้โครงสร้างสแตกช่วยในการคำนวณดังรูปที่ 6.8

Loading image...