Bài giảng Cấu trúc dữ liệu và giải thuật – Bài 11: Ký pháp nghịch đảo Balan (Reverse Polish Notation) thông tin về những kiến thức Reverse Polish Notation; chuyển đổi biểu dạng Infix sang RPN; ví dụ về chuyển đổi từ Infix sang RPN; Prefix Notation.
Cấu trúc liệu giải thuật Bài 11: Ký pháp nghịch đảo Balan (Reverse Polish Notation) Giảng viên: TS Ngo Huu Phuc Tel: 0438 326 077 Mob: 098 5696 580 Email: ngohuuphuc76@gmail.com PhD Ngo Huu Phuc, Le Quy Don Technical University Bài 11: Ký pháp nghịch đảo Balan Nội dung: 11.1 Reverse Polish Notation (RPN) (6) 11.2 Chuyển đổi biểu dạng Infix sang RPN (7) 11.3 Ví dụ chuyển đổi từ Infix sang RPN (9) 11.4 Prefix Notation (3) Tham khảo: Data structures and Algorithms Stacks.htm Kyle Loudon Mastering Algorithms, Chapter Stacks and Queues Elliz Horowitz – Fundamentals of Data Structures, Chapter Stacks and Queues Deshpande Kakle – C and Data Structures, Chapter 19 Stacks and Queues Bài giảng TS Nguyên Nam Hồng PhD Ngo Huu Phuc, Le Quy Don Technical University 11.1 Ký pháp nghịch đảo Balan (RPN) Nội dung phần 11.1: 11.1.1 Khái niệm Ký pháp nghịch đảo Balan (RPN) 11.1.2 Tại sử dụng Ký pháp nghịch đảo Balan? 11.1.3 Một số ví dụ Ký pháp nghịch đảo Balan PhD Ngo Huu Phuc, Le Quy Don Technical University 11.1.1 Khái niệm Ký pháp nghịch đảo Balan Ký pháp nghịch đảo Balan, gọi Postfix, Charles Hamblin đề xuất vào năm 1950s… Ký pháp lấy ý tưởng Polish notation, đề xuất vào năm 1920 nhà tốn học người Balan có tên Jan Łukasiewicz (Trong số tài liệu gọi ký pháp Łukasiewicz) Dạng Infix Dạng Postfix Dạng Prefix A-B/(C+D) ABCD+/- –A/B+CD PhD Ngo Huu Phuc, Le Quy Don Technical University 11.1.2 Tại sử dụng RPN? (1/3) RPN cho phép giảm thời gian việc tính biểu thức Người dùng không cần quan tâm đến dấu ngoặc biểu thức Với ký pháp cho phép thấy kết sau phép toán Với ký pháp này, việc thực máy tính tỏ hiệu hơn!!! PhD Ngo Huu Phuc, Le Quy Don Technical University 11.1.2 Tại sử dụng RPN?(2/3) Với việc cho thấy kết ngay, đó, người sử dụng kiểm tra kết dễ hơn, nhanh Với cách viết này, việc tính tốn dựa thứ tự biểu thức, kết hợp với thứ tự ưu tiên phép tốn RPN có tính logic cao người dùng đưa biểu thức, sau đưa phép tính cần thực PhD Ngo Huu Phuc, Le Quy Don Technical University 11.1.2 Tại sử dụng RPN?(3/3) Xem xét biểu thức đại số dạng Infix sau: 1+2*3=? Kết hay 9? Trả lời: kết phép * có độ ưu tiên cao phép + Xem xét ví dụ: (1+2) * 3? Kết Rõ ràng, với dạng ký pháp này, người dùng dễ nhầm lẫn tính tốn!!! PhD Ngo Huu Phuc, Le Quy Don Technical University 11.1.3 Một số ví dụ RPN (1/2) Xem xét ký pháp RPN sau: + * Kết biểu thức bao nhiêu? 45+ → 4+5=9 96* → * = 54 Biểu thức + * tương tự biểu thức dạng Infix (4+5)*6 Các bước thực hiện: 45+6* 96* 54 PhD Ngo Huu Phuc, Le Quy Don Technical University 11.1.3 Một số ví dụ RPN(2/2) Xem xét biểu thức dạng Postfix: + * Kết biểu thức bằng? 45+ → 4+5=9 69* → * = 54 Biểu thức + * tương đương với biểu thức dạng Infix: * (4 + 5) Các bước thực hiện: 645+* 69* 54 PhD Ngo Huu Phuc, Le Quy Don Technical University 11.2 Chuyển đổi biểu dạng Infix sang RPN 11.2.1 Ví dụ chuyển đổi biểu thức dạng Infix sang RPN 11.2.2 Thuật toán chuyển đổi biểu thức dạng Infix sang RPN 11.2.3 Chương trình chuyển đổi biểu thức dạng Infix sang dạng RPN 10 PhD Ngo Huu Phuc, Le Quy Don Technical University 11.2.1 Ví dụ chuyển đổi biểu thức dạng Infix sang RPN Cho biểu thức dạng Infix: (4 + 5) / (6 + 7) Làm để chuyển đổi từ dạng Infix sang RPN? 45+67+/ Cho biểu thức dạng Infix: ((4+5)*(2+3)+6)/(8+7) Cần gõ phím lần? 21 Kết phép biến đổi sang RPN? 45+23+*6+87+/ Với dạng RPN, cần gõ phím 13 lần 11 PhD Ngo Huu Phuc, Le Quy Don Technical University 11.2.2 Thuật toán chuyển đổi biểu thức dạng Infix sang RPN (1/4) Thuật toán thứ nhất: chuyển đổi biểu thức từ Infix sang Postfix: Bước : Đọc thành phần biểu thức E (dạng Infix biểu diễn xâu, đọc từ trái qua phải) Giả sử thành phần đọc x 1.1 Nếu x tốn hạng viết vào bên phải biểu thức E1 (xâu lưu kết Postfix) 1.2 Nếu x dấu ‘(’ đẩy vào Stack 1.3 Nếu x phép tốn +, -, *, / 1.3.1 Xét phần tử y đỉnh Stack 1.3.2 Nếu Pri(y)>=Pri(x) phép tốn loại y khỏi Stack viết y vào bên phải E1 quay lại bước 1.3.1 1.3.3 Nếu Pri(y)