Chuyển đổi biểu thức dạng Infix sang Postfix 10.2.1.. Chuyển đổi biểu thức dạng Infix sang Prefix 10.3.1.. Chuyển đổi biểu thức dạng Infix sang Postfix 10.2.1.. Chuyển đổi biểu thức dạng
Trang 1Lecture 10 – Polish Notation
10.1 Reverse Polish Notation (RPN)
10.2 Chuyển đổi biểu thức dạng Infix sang Postfix
10.2.1 Chuyển đổi dạng Infix sang Postfix
10.2.2 Tính giá trị biểu thức dạng Postfix
10.3 Chuyển đổi biểu thức dạng Infix sang Prefix
10.3.1 Chuyển đổi dạng Infix sang Prefix
10.3.2 Tính giá trị biểu thức dạng Prefix
10.4 Một số vấn đề thực hành
Trang 2Lecture 10 – Polish Notation
10.1 Reverse Polish Notation (RPN)
10.2 Chuyển đổi biểu thức dạng Infix sang Postfix
10.2.1 Chuyển đổi dạng Infix sang Postfix
10.2.2 Tính giá trị biểu thức dạng Postfix
10.3 Chuyển đổi biểu thức dạng Infix sang Prefix
10.3.1 Chuyển đổi dạng Infix sang Prefix
10.3.2 Tính giá trị biểu thức dạng Prefix
10.4 Một số vấn đề thực hành
Trang 310.1 Reverse Polish Notation
Ký pháp nghịch đảo Balan (RPN), còn được gọi là Postfix,
do Charles Hamblin đề xuất vào những năm 1950s…
Ký pháp này lấy ý tưởng của Polish notation, được đề xuất vào năm 1920 của nhà toán học người Balan có tên Jan Łukasiewicz (Trong một số tài liệu còn gọi là ký pháp Łukasiewicz).
Dạng Infix Dạng Postfix Dạng Prefix
Trang 410.1 Reverse Polish Notation
Trang 510.1 Reverse Polish Notation
Tại sao sử dụng RPN?
RPN cho phép giảm thời gian trong việc tính một biểu thức Người dùng không cần quan tâm đến dấu ngoặc trong bt
RPN cho phép thấy kết quả ngay sau phép toán
Với RPN, việc thực hiện trên máy tính tỏ ra hiệu quả hơn!!!
Với việc cho thấy kết quả ngay, do đó, người sử dụng có thể kiểm tra kết quả dễ hơn, nhanh hơn
Với cách viết này, việc tính toán dựa trên thứ tự của biểu thức, kết hợp với thứ tự ưu tiên của phép toán
RPN có tính logic cao vì người dùng đưa biểu thức, sau đó đưa phép tính cần thực hiện
Trang 610.1 Reverse Polish Notation
Trang 7Kết quả của biểu thức bằng?
Biểu thức 6 4 5 + * tương đương với biểu thức dạng Infix: 6 * (4 + 5)
10.1 Reverse Polish Notation
Trang 810.1 Reverse Polish Notation
Cho biểu thức dạng Infix: (4 + 5) / (6 + 7) Làm thế nào để chuyển đổi từ dạng Infix sang RPN?
Trang 9Lecture 10 – Polish Notation
10.1 Reverse Polish Notation (RPN)
10.2 Chuyển đổi biểu thức dạng Infix sang Postfix
10.2.1 Chuyển đổi dạng Infix sang Postfix
10.2.2 Tính giá trị biểu thức dạng Postfix
10.3 Chuyển đổi biểu thức dạng Infix sang Prefix
10.3.1 Chuyển đổi dạng Infix sang Prefix
10.3.2 Tính giá trị biểu thức dạng Prefix
10.4 Một số vấn đề thực hành
Trang 1010.2.1 Chuyển đổi dạng Infix sang Postfix
Thuật toán 1: chuyển đổi biểu thức từ Infix sang Postfix:
Bước 1: Đọc một thành phần của biểu thức E (dạng Infix biểu diễn bằng xâu,
đọc từ trái qua phải) Giả sử thành phần đọc được là x
1.1 Nếu x là toán hạng thì viết nó vào bên phải biểu thức E1 (xâu lưu kết quả
của Postfix)
1.2 Nếu x là dấu ‘(’ thì đẩy nó vào Stack.
1.3 Nếu x là một trong các phép toán +, -, *, / thì
1.3.1 Xét phần tử y ở đỉnh Stack.
1.3.2 Nếu Pri(y)>=Pri(x) là một phép toán thì loại y ra khỏi Stack và viết y
vào bên phải của E1 và quay lại bước 1.3.1
Trang 1110.2.1 Chuyển đổi dạng Infix sang Postfix
1.4 Nếu x là dấu ‘)’ thì
1.4.1 Xét phần tử y ở đầu của Stack.
1.4.2 y là phép toán thì loại y ra khỏi Stack, viết y vào bên phải E1
và quay trở lại 1.4.1
1.4.3 Nếu y là dấu ‘(’ loại y ra khỏi Stack.
Bước 2: Lập lại bước 1 cho đến khi toàn bộ biểu thức E được đọc qua
Bước 3: Loại phần tử ở đỉnh Stack và viết nó vào bên phải E1 Lặp lại bước này cho đến khi Stack rỗng.
Bước 4: Tính giá trị của biểu thức dưới dạng hậu tố
Chú ý: Hàm
Pri(‘$’)<Pri(‘(‘)<Pri(‘+‘)=Pri(‘-‘)<Pri(‘*‘)=<Pri(‘/‘)
$ ký hiệu đỉnh của Stack
Trang 1210.2.1 Chuyển đổi dạng Infix sang Postfix
Trang 13abc+*de/-Lecture 10 – Polish Notation
10.1 Reverse Polish Notation (RPN)
10.2 Chuyển đổi biểu thức dạng Infix sang Postfix
10.2.1 Chuyển đổi dạng Infix sang Postfix
10.2.2 Tính giá trị biểu thức dạng Postfix
10.3 Chuyển đổi biểu thức dạng Infix sang Prefix
10.3.1 Chuyển đổi dạng Infix sang Prefix
10.3.2 Tính giá trị biểu thức dạng Prefix
10.4 Một số vấn đề thực hành
Trang 1410.2.2 Tính gtbt dạng Postfix
Thuật toán 2 : tính giá trị biểu thức dạng Postfix:
Bước 1: Đọc lần lượt các phần tử của biểu thức E1 (từ trái qua phải)
Nếu gặp toán hạng thì đẩy nó vào Stack
Nếu gặp phép toán thì lấy hai phần tử liên tiếp trong Stack thực hiện phép toán, kết quả được đẩy vào trong Stack
Bước 2: Lập lại bước 1 cho đến khi hết tất cả các phần tử trong biểu thức E1 lúc đó đỉnh của Stack chứa giá trị của biểu thức cần tính
Bước 3: Kết thúc.
Trang 1510.2.2 Tính gtbt dạng Postfix
Xét biểu thức dạng RPN:
4 5 + 2 3 + * 6 + 8 7 + /
51 8 7
4 4
5
4 5
9 9
2
9 2 3
9 2 3
9 5
9 5
45 45
6
45 6
51 51
8
51 8 7
51 15
51 15
Trang 16Lecture 10 – Polish Notation
10.1 Reverse Polish Notation (RPN)
10.2 Chuyển đổi biểu thức dạng Infix sang Postfix
10.2.1 Chuyển đổi dạng Infix sang Postfix
10.2.2 Tính giá trị biểu thức dạng Postfix
10.3 Chuyển đổi biểu thức dạng Infix sang Prefix
10.3.1 Chuyển đổi dạng Infix sang Prefix
10.3.2 Tính giá trị biểu thức dạng Prefix
10.4 Một số vấn đề thực hành
Trang 1710.3.1 Chuyển đổi dạng Infix sang Prefix
Thuật toán 3 chuyển đổi biểu thức từ Infix sang Prefix:
Ý tưởng: Sử dụng queue, stack và stackkq.
Bước 1: Đọc một thành phần của biểu thức E (dạng Infix biểu diễn
bằng xâu, đọc từ phải qua trái) Giả sử thành phần đọc được là x
1.1 Nếu x là toán hạng thì đưa nó vào queue
1.2 Nếu x là dấu ‘)’ thì đẩy nó vào stack
1.3 Nếu x là một trong các phép toán +, -, *, / thì
1.3.1 Kiểm tra xem stack có rỗng không? Nếu rỗng, đẩy vào stack, nếu không rỗng, sang bước 1.3.2
1.3.2 Lấy phần tử y ở đỉnh stack
Trang 1810.3.1 Chuyển đổi dạng Infix sang Prefix
1.3.3 Nếu Pri(y)>=Pri(x), đưa tất cả các phần tử trong queue
vào stackkq, đưa y vào stackkq, đưa x vào stack
1.3.4 Nếu Pri(y)<Pri(x) thì đẩy x vào stack
1.4 Nếu x là dấu ‘(’ thì
1.4.1 Đưa tất cả các phần tử trong queue vào stackkq,
1.4.2 Xét phần tử y ở đầu của stack
1.4.3 y là phép toán thì loại y ra khỏi stack, đưa y vào stackkq, quay về bước 1.4.2
1.4.3 Nếu y là dấu ‘)’ loại y ra khỏi stack
Bước 2: Lập lại bước 1 cho đến khi toàn bộ biểu thức E được duyệt
Trang 1910.3.1 Chuyển đổi dạng Infix sang Prefix
Bước 3: Đưa tất cả các phần tử trong queue vào stackkq, tất cả phần tử trong stack và stackkq
Bước 4: Lấy từng phần tử trong stackkq ra, đó là kết quả dạng
Prefix
Bước 5: Tính giá trị của biểu thức dưới dạng tiền tố.
Chú ý:
Pri(‘(‘)=Pri(‘)‘) <Pri(‘+‘)=Pri(‘-‘)<Pri(‘*‘)=<Pri(‘/‘)
Trang 2010.3.1 Chuyển đổi dạng Infix sang Prefix
Cho biểu thức: E=a*b+c/d
Kết quả: +*ab/cd
Trang 21Lecture 10 – Polish Notation
10.1 Reverse Polish Notation (RPN)
10.2 Chuyển đổi biểu thức dạng Infix sang Postfix
10.2.1 Chuyển đổi dạng Infix sang Postfix
10.2.2 Tính giá trị biểu thức dạng Postfix
10.3 Chuyển đổi biểu thức dạng Infix sang Prefix
10.3.1 Chuyển đổi dạng Infix sang Prefix
10.3.2 Tính giá trị biểu thức dạng Prefix
10.4 Một số vấn đề thực hành
Trang 2210.3.2 Tính gtbt dạng Prefix
Thuật toán 4 Tính giá trị biểu thức dạng Prefix:
Bước 1: Đọc lần lượt các phần tử của biểu thức E1 (từ phải qua trái)
thực hiện phép toán, kết quả được đẩy vào trong stack
Bước 2: Lập lại bước 1 cho đến khi hết tất cả các phần tử trong biểu thức E1 Lúc đó đỉnh của stack chứa giá trị của biểu thức cần tính
Bước 3 Kết thúc.
Trang 2310.3.2 Tính gtbt dạng Prefix
Ví dụ về tính biểu thức dạng Prefix:
/+7 8 + 6 * + 3 2 + 5 4
51 8 7
4 4
5
4 5
9 9 2
9 2 3
9 2 3
9 5
9 5
45 45
6
45 6
51 51
8
51 8 7
51 15
51 15
Trang 24Lecture 10 – Polish Notation
10.1 Reverse Polish Notation (RPN)
10.2 Chuyển đổi biểu thức dạng Infix sang Postfix
10.2.1 Chuyển đổi dạng Infix sang Postfix
10.2.2 Tính giá trị biểu thức dạng Postfix
10.3 Chuyển đổi biểu thức dạng Infix sang Prefix
10.3.1 Chuyển đổi dạng Infix sang Prefix
10.3.2 Tính giá trị biểu thức dạng Prefix
10.4 Một số vấn đề thực hành
Trang 2510.4 Một số vấn đề thực hành
Một số vấn đề liên quan:
1 Chuyển đổi từ Postfix sang Infix
2 Chuyển đổi từ Postfix sang Prefix
3 Chuyển đổi từ Prefix sang Postfix
4 Trường hợp toán hạng không phải là một số!!!
Một vài bài tập nâng cao:
1.Viết chương trình cho phép nhập vào một hàm dạng đa thức dưới dạng chuỗi Nhập giá trị x và in ra giá trị của hàm
2.Viết chương trình cho phép nhập vào một số dạng hàm cơ bản
và vẽ đồ thị hàm
3.Viết chương trình cho phép nhập vào công thức tính toán có
sử dụng một số phép toán như log, khai căn,…