如何将一个字符串转达换成表达式?数据结构里提到过用栈的算法,但是最近有了一个新的想法,不用栈,而只用数组来实现,现把代码贴出来,供各位大大提正。算法原理:定义4个数组,一个用来存放每个字符对应的值,一个用来存放这个值的起始位置,一个用来存放这个值的终止位置,最后一个用来存放这个字符是否参与计算。原理很简单,第一步,将这个字符串中的数值标出来,并且聚在一起;第二步,去括号,第三步,计算同一括号内的值,第四步,得出结果。
代码:Private Sub Command1_Click()
Text1.Text = Trim(Text1.Text)'--------去空
Dim A(100) As Single'-----------------存放数值
Dim B(100) As Integer'----------------存放起点
Dim C(100) As Integer'----------------存放终点
Dim D(100) As Boolean'----------------存放是否参与过计算
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim l As Integer
Dim m As Integer
Dim n As Integer
Dim s1 As String
Dim s2 As String
Dim s3 As String
'---------------------------------------------
'(判断字符串有效性的代码省略)
'-------------Text1.Tag = "(" & Text1.Text & ")"'------------------强行加上括号,可以方便后面计算。
'-将字符聚在一起,比如“(234+1)*5”中的“234”分离出来,用数组A(2)来存放,同时A(2)=A(3)=A(4)
For i = 1 To Len(Text1.Tag)
  s1 = Mid(Text1.Tag, i,1)  If IsNumeric(s1) = True Then
     
     For j = i + 1 To Len(Text1.Tag)
         s2 = Mid(Text1.Tag, j, 1)
         If IsNumeric(s2) = False Then
            A(i) = Val(Mid(Text1.Tag, i, j - i))
            B(i) = i
            C(i) = j - 1
            D(i) = True
            For k = i To j - 1'
               A(k) = A(i)
               B(k) = B(i)
               C(k) = C(i)
               D(k) = True
            Next
            Exit For
         End If
      Next      i = j
  End If
  '
Next'---------------------------------------------------------------优先运算()中的内容
For i = 1 To Len(Text1.Tag)
   s1 = Mid(Text1.Tag, i, 1)
   If s1 = ")" Then
 
      For j = i To 1 Step -1
         s2 = Mid(Text1.Tag, j, 1)
         If s2 = "(" And D(j) = False Then '----找出离“)”最近的“(”且这个“(”没有参与运算
            '-----------------------------------
                For k = j + 1 To i - 1
                    s3 = Mid(Text1.Tag, k, 1)
                    If D(k) = True Then
                       GoTo 10
                    End If
                    If s3 <> "*" And s3 <> "/" Then
                       GoTo 10
                    End If
                    If s3 = "*" Then
                       A(k - 1) = A(k - 1) * A(k + 1)
                    End If
                    If s3 = "/" Then
                       A(k - 1) = A(k - 1) / A(k + 1)
                    End If
                    For l = B(k - 1) To C(k + 1)
                        A(l) = A(k - 1)
                        B(l) = B(k - 1)
                        C(l) = C(k + 1)
                        D(l) = True
                    Next
10:
                Next
                For k = j + 1 To i - 1
                    s3 = Mid(Text1.Tag, k, 1)
                    If D(k) = True Then
                       GoTo 20
                    End If
                    If s3 <> "+" And s3 <> "-" Then
                       GoTo 20
                    End If
                    If s3 = "+" Then
                       A(k - 1) = A(k - 1) + A(k + 1)
                    End If
                    If s3 = "-" Then
                       A(k - 1) = A(k - 1) - A(k + 1)
                    End If                    For l = B(k - 1) To C(k + 1)
                        A(l) = A(k - 1)
                        B(l) = B(k - 1)
                        C(l) = C(k + 1)
                        D(l) = True
                    Next
20:
                Next
                For k = j To i
                    A(k) = A(j + 1)
                    B(k) = j
                    C(k) = i
                    D(k) = True
                Next
                Exit For
         End If
       Next
    End If
Next 
 MsgBox A(1)end sub'------以上代码在Win2000,VB6.0环境下调试通过