ดาวน์โหลดงานนำเสนอ
งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ
ได้พิมพ์โดยNoi Suchinda ได้เปลี่ยน 10 ปีที่แล้ว
1
Infix to Postfix มหาวิทยาลัยเนชั่น หลักการภาษาชุดคำสั่ง
First version of slide on 04-July-2007 มหาวิทยาลัยเนชั่น อ.บุรินทร์ รุจจน พันธุ์ . ปรับปรุง 9 มิถุนายน
2
ที่มาที่ไป เมื่อมีนิพจน์ (Expression) ซึ่งเป็นคำสั่ง กำหนดค่าให้กับข้อมูล ในภาษาคอมพิวเตอร์ ย่อมมี ความจำเป็นต้องแปลความหมาย และแปลงให้ คอมพิวเตอร์เข้าใจได้โดยง่าย ตามหลักโครงสร้าง ข้อมูล (Data Structure) คือการแปลงจาก infix เป็น postfix Stack มีการทำงานแบบ LIFO ถูกนำมาอธิบาย การทำงานของการแปลงจาก infix เป็น postfix อยู่ เสมอ โดยพิจารณาน้ำหนักของเครื่องหมายในนิพจน์ และเครื่องหมายที่ถูกกระทำก่อนไปหลังคือ 1. วงเล็บ Parenthesis () 2. ยกกำลัง Exponentiation ^ (Left to Right) 3. คูณและหาร Multiplication *, Division / (Left to Right) 4. บวกและลบ Addition +, Subtraction - (Left to Right)
3
ความหมายของสแตก สแตก คือ ลิเนียร์ลิสต์ (Linear List) เมื่อเพิ่มข้อมูลหรือ ลบข้อมูลในสแตกจะ กระทำทีปลายเพียงข้างเดียวกัน ปลายข้างนั้นเรียกว่า ท๊อปของสแตก (Top Of Stack) มีคุณสมบัติเป็น ไลโฟลิสต์ (LIFO List) คือสมาชิกที่เข้าลิสต์หลังสุดจะออกจากลิสต์ก่อน การนำข้อมูลเข้าในสแตกเรียกว่าพูชชิ่ง (pushing) การนำข้อมูลออกจากสแตกเรียกว่า ป๊อปปิ้ง (poping)
4
ความหมายของ infix และ postfix
1 infix: a + b + c 1 postfix: a b + c + 2 infix: a + b * c - d 2 postfix: a b c * + d - 3 infix: a + b * (c - d) 3 postfix: a b c d - * +
5
ตัวอย่างการแปลง 1 Expression: a + b + c infix Stack postfix 1 a a
3 b ab ab+ 5 c ab+c ab+c+ Source Code :
6
ตัวอย่างการแปลง 2 Expression: a + b * c - d infix Stack postfix 1 a a
3 b ab 4 * +* ab 5 c abc* abc*+ 7 d - abc*+d abc*+d-
7
ตัวอย่างการแปลง 3 Expression: a + b * (c - d) infix Stack postfix
1 a a a 3 b + ab 4 * +* ab 5 ( +*( ab 6 c +*( abc 7 - +*(- abc 8 d +*(- abcd 9 ) +* abcd- abcd-*+
8
กฎเกี่ยวกับการแปลง 1. ถ้าข้อมูลเข้า (input) เป็นตัวถูกดำเนินการ (operand) ให้นำออกไปเป็นผลลัพธ์ (output) 2. ถ้าข้อมูลเข้าเป็นตัวดำเนินการ (operator) ให้ดำเนินการดังนี้ 2.1 ถ้าสแตคว่าง ให้ push operator ลงในสแตค 2.2 ถ้าสแตคไม่ว่าง ให้เปรียบเทียบ operator ที่เข้ามากับ operator ที่อยู่ในตำแหน่ง TOP ของสแตค 2.2.1 ถ้า operator ที่เข้ามาสำคัญมากกว่า operator ที่ตำแหน่ง TOP ของสแตคให้ push ลงสแตค 2.2.2 ถ้า operator ที่เข้ามามีความสำคัญน้อยกว่าหรือเท่ากับ operator ที่อยู่ในตำแหน่ง TOP ของสแตค ให้ pop สแตคออกไปเป็นผลลัพธ์ แล้วทำการเปรียบเทียบ operator ที่เข้ามากับ operator ที่ตำแหน่ง TOP ต่อไป จะหยุดจนกว่า operator ที่เข้ามาจะมีความสำคัญมากกว่า operator ที่ตำแหน่ง TOP ของสแตค แล้วจึง push operator ที่เข้ามานั้นลงสแตค 3. ถ้าข้อมูลเข้าเป็นวงเล็บเปิด ให้ push ลงสแตค 4. ถ้าข้อมูลเข้าเป็นวงเล็บปิด ให้ pop ข้อมูลออกจากสแตคไปเป็นผลลัพธ์จนกว่าจะถึงวงเล็บ เปิด จากนั้นทิ้งวงเล็บเปิดและปิดทิ้งไป 5. ถ้าข้อมูลเข้าหมด ให้ pop ข้อมูลออกจากสแตคไปเป็นผลลัพธ์จนกว่าสแตคจะว่าง
9
Algorithm in j2sdk 1.5 boolean opGreaterEqual(char a, char b){ return (a=='*' || a=='/') >= (b=='*' || b=='/'); } apstring infixToPostfix(apstring s){ int len=s.length(); char temp; apstring ans=""; apstack<char> stack; for(int i=0; i<len; i++){ if (s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/'){ while( !stack.isEmpty() && stack.top()!='(' ){ if ( opGreaterEqual(stack.top(), s[i]) ) { stack.pop(temp); ans+=temp; } else break; stack.push(s[i]); } else if ( s[i]=='(' ) { stack.push('('); } else if ( s[i]==')' ) { while ( !stack.isEmpty() && stack.top()!='(' ) { if ( !stack.isEmpty() ) stack.pop(); } else if ( s[i]>='A' && s[i]<='Z' ) { ans+=s[i]; while ( !stack.isEmpty() ){ return ans; ข้อมูล
งานนำเสนอที่คล้ายกัน
© 2024 SlidePlayer.in.th Inc.
All rights reserved.