You are on page 1of 2

Thuật toán chuyển đổi biểu thức từ trung tố sang hậu tố:

− Nếu gặp 1 toán hạng (con số hoặc biến) thì nó ghi vào kết quả
(chuỗi kết quả là biểu thức trung tố).
− Nếu gặp dấu mở ngoặc thì đưa nó vào stack.
− Nếu gặp 1 toán tử (ví dụ là t1) thì thực hiện 2 bước sau:
o Nếu stack không rỗng, hoặc còn toán tử t2 ở đỉnh
ngăn xếp và độ ưu tiên của t1 nhỏ hơn hay bằng độ ưu
tiên của t2 thì lấy t2 ra khỏi ngăn xếp và ghi vào kết quả.
o Nếu stack rỗng hoặc toán tử t2 ở đỉnh stack có độ
ưu tiên thấp hơn t1 thì ghi (push) t1 vào ngăn xếp
−Nếu gặp dấu đóng ngoặc thì cứ lấy các tất cả các toán tử
trong ngăn xếp ra và ghi vào kết quả cho đế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ần lượt lấy tất cả toán
hạng (nếu có) từ ngăn xếp và ghi vào chuỗi kết quả.

Ví dụ: chuyển đổi biểu thức trung tố sau sang hậu tố:
3+4*2/(1-5)
Kết quả là: 3 4 2 * 1 5 - / +
Quá trình làm việc của thuật toán như sau:
Ký tự Stack Trình tự làm việc Kết quả
3 {Empty} Đầu vào là 1 toán 3
hạng (số) nên
chương trình ghi
vào kết quả
+ + Do stack rỗng và 3
toán tử “+” ở
đỉnh stack nên ghi
toán tử “+” vào
ngăn xếp
4 + Toán hạng tiếp 34
theo nên vẫn đưa
ra kết quả
* +* Toán tử “+” ở 34
đỉnh stack có độ
ưu tiên thấp hơn
toán tử “*” nên
“*” được ghi vào

1
stack
2 +* Đưa ra kết quả 342
/ +/ Stack không rỗng, 342*
độ ưu tiên của
phép toán “/”
bằng “*” nên khi
“/” vào sẽ đẩy “*”
ra
( +/( Dấu mở ngoặc “(”
nên đưa nó vào
stack
1 +/( Đưa ra kết quả 342*1
- +/(- Đẩy vào stack 342*1
5 +/(- Đưa ra kết quả 342*15
) +/ Gặp dấu đóng 342*15-/+
ngoặc nên stack
sẽ đẩy hết toán tử
ra theo quy luật
“last in first out”
{Empty}

You might also like