求算法——关于字符串映射替换的有关问题
求算法——关于字符串映射替换的问题
比如:原字符串“(A1+D3)*A11”
有如下映射关系 A1 -> Var1
D3 -> Var2
A11 -> Var3
转换后的字符串应为“(Var1+Var2)*Var3”
请问擅长于算法的朋友,应该实现上面的转换?谢谢!!
------解决方案--------------------
属于基本的算术式解析,给你一段四则运算解析代码示例:
比如:原字符串“(A1+D3)*A11”
有如下映射关系 A1 -> Var1
D3 -> Var2
A11 -> Var3
转换后的字符串应为“(Var1+Var2)*Var3”
请问擅长于算法的朋友,应该实现上面的转换?谢谢!!
------解决方案--------------------
属于基本的算术式解析,给你一段四则运算解析代码示例:
- VB code
Option Base 1 Dim tt(20) As String '存放按+,-号分解出来的式子,只设定了20个 Private Sub Command1_Click() Text2.Text = handle(Text1.Text) End Sub Private Function handle(a) '按括号分解式子 Dim th, th2 As String '存放按括号分解出来的式子 Do While True n1 = InStr(a, "(") '查找 n2 = InStr(a, ")") Select Case True Case n1 = 0 And n2 = 0 '没有括号 Exit Do Case n1 > 0 And n2 = 0 '有 "(" 没 ")" MsgBox "表达式错误" Exit Function Case n2 > 0 And n1 = 0 '有 ") 没 "(" MsgBox "表达式错误" Exit Function Case n1 > n2 '出现") (" MsgBox "表达式错误" Exit Function Case Else Do '如果出现这种情况"((( )))",则取最里面的括号开始分解 zl = n1 n1 = InStr(n1 + 1, a, "(") Loop Until n1 > n2 Or n1 = 0 th = Mid(a, zl, n2 - zl + 1) '存放分解出来的式子 th2 = Mid(th, 2, Len(th) - 2) '去括号 a = Replace(a, th, handle1(th2)) '计算分解出来的式子,并把结果替换进去 End Select Loop handle = handle1(a) '得到最后结果 End Function Private Function handle1(b) '把handle3的每个结果相加 n = handle2(b) s = 0 '累加数初值 For i = 1 To n s = s + handle3(tt(i)) '计算各乘除式的值并累加 Next i handle1 = s '得到结果 End Function Private Function handle2(t) '按+,-分解式子 '添以"+"开头,方便处理 If Left(t, 1) <> "+" And Left(t, 1) <> "-" Then t = "+" & t k = 0 '用已累计分解出来的式子数 Do While t <> "" n1 = InStr(2, t, "+") '查找 n2 = InStr(2, t, "-") k = k + 1 Select Case True Case n1 = 0 And n2 = 0 '无+、-号 tt(k) = t '取剩余部分 t = "" Case n2 = 0 Or (n1 < n2 And n1 > 0) '无-号或先遇到+号 tt(k) = Left(t, n1 - 1) '从该+号开始截取 t = Mid(t, n1) Case n1 = 0 Or (n1 > n2 And n2 > 0) '无+号或先遇到-号 tt(k) = Left(t, n2 - 1) '从该-号开始截取 t = Mid(t, n2) End Select Loop handle2 = k '分解出来的式子个数 End Function Private Function handle3(x) '计算handle2分解出来的式子 f = Left(x, 1) '取出符号+或- x = "*" & Mid(x, 2) '添以"*"开头,方便处理 Sum = 1 '累乘/除的初值 Do While x <> "" n1 = InStr(2, x, "*") '从第2个字符开始查找 n2 = InStr(2, x, "/") Select Case True Case n1 = 0 And n2 = 0 '无乘除号 y = x x = "" Case n2 = 0 Or (n1 < n2 And n1 > 0) '无/号或先遇到*号 y = Left(x, n1 - 1) '取至*号前 x = Mid(x, n1) Case n1 = 0 Or (n1 > n2 And n2 > 0) '无*号或先遇到/号 y = Left(x, n2 - 1) '取至/号前 x = Mid(x, n2) End Select If Left(y, 1) = "*" Then '根据式子前面的符号进行运算 Sum = Sum * Val(Mid(y, 2)) Else Sum = Sum / Val(Mid(y, 2)) End If Loop handle3 = Val(f & Str(Sum)) '加上正负号 End Function