用于检查String是否具有平衡括号的递归算法

时间:2012-09-21 22:38:51

标签: algorithm data-structures recursion solution

  

可能重复:
  Basic Recursion, Check Balanced Parenthesis

我最近在算法设计手册中遇到过这个问题,即使基于堆栈的算法非常简单,我想为这个问题写一个递归算法,但是在递归中我是一个菜鸟,我无法想出多少那么有人可以帮我解决这个问题吗?

PS我只看到关于这个问题的其他帖子,但他们不是很有效率,而且那些人,不是很好的解释。

1 个答案:

答案 0 :(得分:12)

背景:查找括号是否平衡的问题实际上是一个决策问题,描述它的语言 1 context-free language。 可以使用具有堆栈 2

的自动机来解析上下文无关语法

因此,可以针对此问题实现以下迭代解决方案

iterative(str):
  stack <- empty stack
  for each char in str:
     if char is open paranthesis: //push the paranhtesis to stack
         stack.push(char)
     else if char is close parantesis: //if close paranthesis - check if it is closing an open parenthesis
         if stack.head() == matchingParanthesis(char):
            stack.pop()
         else: //if the closing parenthesis do not close anything previously opened, return false
             return false 
   //end of loop - check if all opened parenthesis were closed:
   return stack.isEmpty()

这个想法是表示已打开范围的括号位于堆栈的头部,每个右括号 - 您可以通过查看堆栈的头部来验证它是否正在关闭相应的左括号。

注意:很容易看出,对于单个类型的括号,我们可以使用整数来模拟堆栈(因为我们实际上只需要计算数字,而不关心括号的类型)。 / p>

另外,由于循环+堆栈算法实际上与递归类似,我们可以推导出以下递归算法

checkValidty(str,currentParenthesis,currentIndex): 
//currentIndex is a common variable, changed by reference to affect all levels of recursion!
   while (currentIndex < str.size()):
      char <- str[currentIndex]
      currentIndex <- currentIndex + 1
      if char is open paranthesis: 
        //if the recursive call is unseccesfull - end the check, the answer is no
         if !checkValidity(str,char,currentIndex): 
            return false
      else if char is close parantesis: 
         if currentParenthesis == matchingParanthesis(char):
            return true
         else: //if the closing parenthesis do not close anything previously opened, return false
             return false 
   //end of loop - check if all opened parenthesis were closed:
   return currentParenthesis == nil

使用checkValidty(str,nil,0)进行调用 - 其中str是经过验证的字符串。

很容易看出迭代和递归算法实际上是相同的,在第二个我们使用调用堆栈和变量lastParenthesis作为堆栈的头部。


(1)语言是问题所接受的所有单词。例如,(w)使用的是语言,而)w(则不是。
(2)确切地说:一些语法需要一个非确定性的自动机和一个堆栈,但这是一个更理论化的东西,而不是这里的问题。