+ -
当前位置:首页 → 问答吧 → 求个小算法,关于括号的⋯⋯

求个小算法,关于括号的⋯⋯

时间:2011-10-11

来源:互联网

有一个表达式,类似:1+(((((3-5))+((2)))))+2
改为:1+((3-5)+2)+2

作者: ybh37   发布时间: 2011-10-11


偷懒了⋯⋯
大家有好办法吗?没有的话⋯⋯

作者: ybh37   发布时间: 2011-10-11

较复杂啊,算法的话就是判断所有的双括号是否满足删除条件。

作者: sysdzw   发布时间: 2011-10-11

正序存栈
反序存栈

作者: alifriend   发布时间: 2011-10-11

都是加啊减的,怎么不能改成 1+3-5+2+2呢

作者: king06   发布时间: 2011-10-11

为了挣分拼了。

Option Explicit

VB code
Private Sub Form_Load()
    Dim s$, isContinue As Boolean
    s = "1+(((((3-5))+((2)))))+2"
    
    Dim s2$, v, i%, j%, i1%, i2%
    MsgBox getMatch(s, 3)
    
    Do
        isContinue = False
        For i = 1 To Len(s)
            If Mid(s, i, 1) = "" Then
                i1 = getMatch(s, i)
                If Mid(s, i + 1, 1) = "" Then '两个(
                    i2 = getMatch(s, i + 1)
                    If i1 - i2 = 1 Then
                        s = Left(s, i - 1) & Mid(s, i + 1, i2 - i - 1) & Mid(s, i2 + 1)
                        isContinue = True
                    End If
                ElseIf i1 - i = 2 Then '类似(2)
                    s = Left(s, i - 1) & Mid(s, i + 1, 1) & Mid(s, i + 3)
                    isContinue = True
                End If
            End If
        Next
        If Not isContinue Then Exit Do
    Loop
    MsgBox s
End Sub

Private Function getMatch(strKey$, intPos%) As Integer
    Dim s$, v, i%, j%, intLCount%, intRCount%
    Dim strTmp$
    For i = intPos To Len(strKey)
        strTmp = Mid(strKey, i, 1)
        If strTmp = "" Then
            intLCount = intLCount + 1
        ElseIf strTmp = "" Then
            intRCount = intRCount + 1
            If intRCount = intLCount Then
                getMatch = i
                Exit Function
            End If
        End If
    Next
End Function

作者: sysdzw   发布时间: 2011-10-11

热门下载

更多