Theo nhu cầu của thành viên, tôi xin viết lại một Demo trên ngôn ngữ VB (sử dụng VB.NET 2005) để chuyển đổi một biểu thức toán học thành chuỗi theo ký pháp Ba Lan mà chúng ta đã biết.
Có lẽ đây là code đầu tiên mà các bạn được thấy với thuật toán này trên VB.NET, vì từ trước đến nay mọi người chỉ viết trên C++ thôi, nó ngắn gọn hơn, dễ viết hơn, ... đơn giản vậy thôi.
Trong bài viêt này, bạn sẽ thấy để giải quyết công việc đó trên VB cũng không có gì khó, tuy nhiên bạn sẽ cảm thấy hơi dài dòng một chút:
'Author: Pham Dinh Nam
'Adress: Dalat Vocational Training College - 01 Hoang Van Thu st - Dalat city
'Email: admin@cdndalat.edu.vn
'Website: http://cdndalat.edu.vn
'Mobile: 0988.131.130
'Để đơn giản ta chỉ thực hiện các phép toán +,-,*,/
Function LaToanTu(ByVal ch As Char) As Boolean
Return ((ch = "+") Or (ch = "-") Or (ch = "*") Or (ch = "/"))
End Function
'Để đơn giản ta định nghĩa toán hạng là những ký hiệu ngoài 4 phép toán +,-,*,/
Function LaToanHang(ByVal ch As Char) As Boolean
Return ((ch <> "+") And (ch <> "-") And (ch <> "*") And (ch <> "/"))
End Function
Function UuTien(ByVal toanhang As Char) As Integer
Select Case (toanhang)
Case "+"
Return 1
Case "-"
Return 2
Case "/"
Return 3
Case "*"
Return 4
'............
End Select
End Function
Function KetQua(ByVal chuoi As String) As String
Dim iString As Integer = 1, iStack As Integer = 1, iResult As Integer = 0
Dim Stack As String = " " 'Đặt 1 khoảng trắng (có độ dài 1 cho dễ lập trình)
Dim Result As String = ""
While iString <= Len(chuoi)
If Mid(chuoi, iString, 1) = "(" Then 'Nếu gặp dấu (
Stack = Stack & Mid(chuoi, iString, 1) 'thì nạp dấu ( vào Stack
iStack = iStack + 1
ElseIf LaToanHang(Mid(chuoi, iString, 1)) Then 'Nếu là toán hạng
Result = Result & Mid(chuoi, iString, 1) 'thì đưa toán hạng vào chuỗi kết quả
iResult = iResult + 1
ElseIf LaToanTu(Mid(chuoi, iString, 1)) Then 'Nếu là toán tử
'Trong khi toán tử ở đỉnh Stack lớn hơn toán tử đang xét
While LaToanTu(Mid(Stack, iStack, 1)) And UuTien(Mid(Stack, iStack, 1)) >= UuTien(Mid(chuoi, iString, 1))
iResult = iResult + 1
Result = Result & Mid(Stack, iStack, 1)
Stack = Stack.Remove(iStack - 1)
iStack = iStack - 1
End While
iStack = iStack + 1
Stack = Stack & Mid(chuoi, iString, 1) 'Thêm toán tử đang xét Stack
ElseIf Mid(chuoi, iString, 1) = ")" Then 'Nếu gặp dấu )
While Mid(Stack, iStack, 1) <> "(" 'Trong khi gặp dấu (
iResult = iResult + 1
Result = Result & Mid(Stack, iStack, 1) 'Lấy ra và đưa vào chuỗi Kết quả
Stack = Stack.Remove(iStack - 1)
iStack = iStack - 1
End While
Stack = Stack.Remove(iStack - 1)
iStack = iStack - 1
End If
iString = iString + 1
End While
While iStack <> 1 'Nạp toàn bộ toán hạng (nếu còn) trong Stack ghi vào chuỗi kết quả
iResult = iResult + 1
Result = Result & Mid(Stack, iStack, 1)
Stack = Stack.Remove(iStack - 1)
iStack = iStack - 1
End While
Return Result
End Function
Công việc còn lại là các bạn chỉ thực hiện việc gọi hàm KetQua, tôi có làm một demo trên VB.NET 2005, đăng nhập thành viên để download nhé!