Thuật toán kí pháp ba lan
Trang 1www.themegallery.com
ĐỀ TÀI BÁO CÁO:
THUẬT TOÁN KÍ PHÁP BA LAN
Trang 2GIỚI THIỆU CHUNG
2.THUẬT TOÁN KÍ PHÁP BA LAN
1.SƠ LƯỢC VỀ THUẬT TOÁN KÍ PHÁP
BA LAN
3.CÀI ĐẶT TRÊN C
Trang 3SƠ LƯỢC VỀ THUẬT TOÁN KÍ
PHÁP BA LAN
Ký pháp nghịch đảo Ba Lan được phát minh vào khoảng giữa thập kỷ 1950 bởi Charels
Hamblin-một triết học gia và khoa học gia
máy tính người Úc-dựa theo công trình về ký pháp Ba Lan của nhà Toán học người Ba Lan Łukasiewicz
Trang 4SƠ LƯỢC VỀ THUẬT TOÁN KÍ
PHÁP BA LAN
Biểu thức tiền tố (prefix): Được biểu diễn
bằng cách đặt toán tử lên trước toán hạng
hai toán hạng.
bằng cách đặt toán tử sau toán hạng
Trang 5THUẬT TOÁN KÍ PHÁP BA LAN
1 Ý tưởng của bài toán
Đọc biểu thức từ trái sang phải, nếu gặp
một toán hạng (con số hoặc biến) thì push toán hạng vào ngăn xếp, nếu gặp toán tử, lấy hai toán hạng ra khỏi ngăn xếp (stack), tính kết quả, đẩy kết quả trở lại ngăn xếp.
Khi quá trình kết thúc con số cuối cùng còn
lại trong ngăn xếp chính là giá trị của biểu thức đó.
Trang 6THUẬT TOÁN KÍ PHÁP BA LAN
2.Trình bày thuật toán.
a Thuật toán chuyển đổi từ trung tố sang hậu tố:
+ Nếu gặp một toán hạng (con số hoặc biến) thì ghi nó vào
chuỗi kết quả (chuỗi kết quả là biểu thức trung tố).
+ Nếu gặp dấu mở ngoặc, đưa nó vào Stack.
+ Nếu gặp một toán tử (gọi là 01) thực hiện 2 bước sau:
- Nếu có toán tử 02 ở đỉnh ngăn xếp và độ ưu tiên của 01 nhỏ hơn hay bằng độ ưu tiên của 02 thì lấy 02 ra khỏi ngăn xếp và ghi vào kết quả.
- Push 01 vào ngăn xếp.
+ Nếu gặp dấu đóng ngoặc thì lấy các toán tử trong ngăn
xếp ra và ghi vào kết quả đến khi lấy được dấu mở ngoặc
ra khỏi ngăn xếp.
+ Khi đã duyệt hết biểu thức trung tố, lấy lần lượt tất cả các
toán hạng (nếu có) từ ngăn xếp ra và ghi vào chuỗi kết quả.
Trang 7THUẬT TOÁN KÍ PHÁP BA LAN
b Thuật toán tính giá trị của biểu thức hậu tố.
+ Lặp qua các Token của biểu thức postfix từ trái
qua phải:
+ Nếu là toán hạng: Push vào Stack.
+ Nếu là toán tử: Pop hai toán hạng trong Stack ra
và tính giá trị của chúng dựa vào toán tử này Push kết quả đó lại vào Stack.
+ Phần tử còn sót lại trong Stack sau vòng lặp chính
là kết quả của biểu thức.
Trang 8THUẬT TOÁN KÍ PHÁP BA LAN
c.Trình bày thuật toán:
- Input: Biểu thức trung tố hợp lệ.
- Output: Giá trị của biểu thức hậu tố.
- Process:
Thuật toán chuyển từ dạng trung tố sang hậu tố:
+ Khởi động Stack rỗng
+ While (Không có lỗi và chưa hết biểu thức)
- Đọc Token (Token=hằng/biến/toán tử số học/ngoặc trái/ngoặcphải).
- Nếu Token là:
*) Ngoặc trái: Push vào Stack.
*) Ngoặc phải: Pop và hiển thị các phần tử của Stack đến khi gặp ngoặc trái.
*) Toán tử: Nếu Stack rỗng hay Token được ưu tiên hơn phần tử ở đỉnh Stack thì Push vào Stack Ngược lại Pop và hiên thị một phần tử ở đỉnh Stack Lặp lại việc so sánh Token với một phân tử ở đỉnh Stack.
Toán hạng: hiển thị nó.
Khi hết biểu thức trung tố: Pop và hiển thị toàn bộ Stack còn lại.
Trang 9THUẬT TOÁN KÍ PHÁP BA LAN
Thuật toán tính giá trị biểu thức hậu tố:
+ Khởi động Stack rỗng.
+ Lặp lại các bước sau đến khi hết biểu thức:
- Đọc Token (Hằng/biến/toán tử).
- Nếu Token là:
Toán hạng: Push vào Stack.
Toán tử:
Pop 2 giá trị
Áp dụng toán tử cho 2 giá trị lấy ra.
Push kết quả vào Stack.
-End.
Trang 10THUẬT TOÁN KÍ PHÁP BA LAN
3 Ví dụ minh họa.
- Input: (6+4*(2+6))/2
- Output: 19.
- Process:
Chuyển từ biểu thức từ dạng trung tố sang
hậu tố:
Các bước chuyển đổi được thực hiện như
bảng dưới đây:
Trang 11THUẬT TOÁN KÍ PHÁP BA LAN
) Pop đến khi lấy được ),ghi các toán tử Pop được ra kết quả ( + * 6 4 2 6 +
) Pop đến khi lấy được ),ghi các toán tử Pop được ra kết quả 6 4 2 6 + * +
Pop tất cả các toán tử ra khỏi ngăn xếp và ghi vào kết quả 6 4 2 6 + * + 2/
Trang 12THUẬT TOÁN KÍ PHÁP BA LAN
Tính giá trị của biểu thức hậu tố:
Quá trình tính toán được diễn ra như bảng dưới đây:
Kí tự Thao tác Trạng thái Stack
2 Push 2 6 4 2
6 Push 6 6 4 2 6
+ Tính 2+6 ,Push 8 6 4 8
* Tính 4*8,Push 32 6 32
+ Tính 6+32 38
/ Tính 38/2,Push 19 19
Trang 13CÀI ĐẶT TRÊN C
1.Mô tả cài đặt chương trình:
- Input: Biểu thức số học dạng trung tố.
- Output: Giá trị kết quả của biểu thức dạng hậu tố.
- Process:
- Hàm main: nhập biểu thức vào xâu input, gọi hàm
chuyển đổi ,tính toán đưa kết quả ra màn hình.
- Hàm convert (char *input, char *output): phân tích xâu biểu thức vào input, chuyển đổi xâu biểu thức ra output
là biểu thức số học ban đầu dưới dạng hậu tố.
+ Duyệt lần lượt các phần tử của xâu input.
+ Bỏ qua khi gặp dấu cách.
+ Nếu là chữ số hoặc dấu chấm (số thực) :đưa vào xâu output.
+ Gặp dấu mở ngoặc ‘(’ : đẩy vào Stack.
Trang 14
CÀI ĐẶT TRÊN C
+ Gặp dấu cộng ‘+’ hoặc trừ ‘-’ mà đỉnh ngăn xếp là dấu ‘(’
thì đẩy vào, còn không phải là dấu mở ‘(’ thì lấy phần tử đỉnh ra khỏi ngăn xếp trước, đưa vào xâu output rồi đẩy vào Stack.
+ Gặp dấu nhân ‘*’ hoặc chia ‘/’ : đẩy vào nếu đỉnh không phải là ‘(’ , ‘+’ , hoặc ‘-’ , lấy phần tử đỉnh ra trước đưa vào output rồi đẩy vào Stack nếu ngược lại.
+ khi gặp các toán tử lũy thừa ‘^’ , căn thức ‘√’, logarit ‘l’, các hàm lượng giác ( sin → ‘s’, cos → ‘c’, tan→’t ’): đẩy vào ngay nếu đỉnh không phải là các toán tử ở trên, lấy phần tử đỉnh ra trước đưa vào output rồi đẩy vào Stack nếu ngược lại.
+ Gặp dấu đóng ngoặc ‘)’ :đẩy các phần tử trong ngăn
xếp ra đến khi gặp dấu mở ngoặc ‘(’ đưa vào xâu output + cuối cùng thu được xâu output là biểu thức dạng hậu tố.
Trang 15CÀI ĐẶT TRÊN C
hậu tố, tính toán giá trị biểu thức theo thuật toán Ba Lan, trả lại giá trị là kết quả của biểu thức ban đầu.
+ Duyệt xâu chứa biểu thức dạng hậu tố.
+ Duyệt từng phần tử của xâu.
+ Nếu gặp dấu cách thì bỏ qua, nếu phần tử = null thì kết thúc.
+ Gặp chữ số hoặc dấu chấm lưu ra một xâu tạm thời để thực
hiện việc chuyển đổi sang kiểu số thực đây vào Stack.
+ Khi gặp các toán tử 2 ngôi : +, -, *, /, ^: đẩy lần lượt 2 phần tử ở đỉnh ngăn xếp ra, lưu vào 2 biến tạm thời rôi thực hiện phép tính.
+ Khi gặp toán tử một ngôi : sin, cos, tan, ln, e^ đẩy phần tử đỉnh
ra lưu vào biến tạm thời rồi tính.
+ Lặp lại quá trình đến khi duyệt hết xâu (Khi ngăn xếp còn duy nhất một phần tử).
-End.
Trang 16CÀI ĐẶT TRÊN C
Một số lưu ý:
Các phép toán mà
chương trình có thể
thực hiện được
Phép toán Biểu diễn Ví dụ
Lũy thừa X^y 2^3 Lũy thừa cơ số e Ex E3 Căn bậc 2 √x √25 Logarit tự nhiên Lnx hoặc lx 120 sin Sinx hoặc sx S45 cos Cosx hoặc cx C30 tan Tanx hoặc tx t45
Trang 17CÀI ĐẶT TRÊN C
Một số lưu ý:
- Số thực: Ví dụ: 5.3
- Số âm: Ví dụ: -5
- Các góc trong các hàm lượng giác được tính theo đơn vị
radian.
- Có thể sử dụng các dấu đóng mở ngoặc Ví dụ: (2+5)*5-5.3/
(5.4-7)
- Các cách nhập biểu thức sau là không hợp lệ:
→sin-5→ Hợp lệ: sin(-5).
→e-3→ Hợp lệ: e(-3)
→2/-1→ Hợp lệ: 2/(-1).
<Dấu trừ không được viết liền sau các toán tử để phân biệt số
âm và toán tử ’-’>
→vv7→ Hợp lệ: v(v7).
→lnsin2→ Hợp lệ: ln(sin2).
<Các toán tử một ngôi không được viết liền nhau>
Trang 18www.themegallery.com
Add your company slogan