匹配括号与递归和堆栈

时间:2018-04-01 15:35:14

标签: java

我试图找出如何使用递归编写此代码。我已经完成了循环播放,但绝对不知道如何在这里使用递归。我是代码新手。谢谢你的帮助。 附: 对不起,如果我没有解释这是什么。目标是找出给定字符串输入中存在多少匹配括号对。如果集合不平衡,它也应该返回-1。 这些是说明 类名。

MatchingBracesFirstNameLastName.java Stack.java 描述

编写一个程序来匹配括号(),方括号[]和花括号{}。您的程序应该使用递归方法,该方法返回每种类型的大括号的对数,如果特定对的不平衡,则返回-1。您还应该创建一个Stack类,该方法将使用该类来匹配大括号。

import java.util.*;

public class MatchingBraces
{
   public static void main(String []args)
   {
      Scanner input = new Scanner(System.in);
      String text = input.nextLine();
      System.out.println(match(text, '(', ')', 0));
      System.out.println(match(text, '[', ']', 0));
      System.out.println(match(text, '{', '}', 0));
   }

   public static int match(String text, char open, char close, int startIndex)
   {  
      Stack<Character> stack = new Stack<Character>();
      int count = 0;
      char c;
      for(int i = 0; i < text.length(); i++)
      {
         c = text.charAt(i);
         if(c == open)
            stack.push(c);

         if(c == close)
         {
            if(stack.empty())
               return count;
            else if(stack.peek() == open)
            {
               stack.pop();
               count++;
            }
         }
      }
     return count;
   }
}

2 个答案:

答案 0 :(得分:0)

首先,我将重新定义问题的一部分是递归的(或者是面向堆栈的,它们是同构的)。您正在扫描输入字符串,并且您想要计算平衡的令牌对的数量。

因此,您可以将其分解为两个子问题:

  1. 查找字符串中的每个空缺字符,并检查它是否具有匹配的关闭字符。
  2. 给定开放字符的位置,找到匹配的关闭字符的位置。
  3. 这两个问题都可以递归实现,但问题#2更自然地是一个递归问题。这是因为问题自然是嵌套的:当你为一对找到匹配的关闭字符时,如果你遇到一个新的开放字符,你需要先找到匹配的关闭字符 it 在回去寻找当前匹配的关闭字符之前。这是制定问题的经典归纳法或递归法。

    如果你的复杂程度更高,你可以通过将子问题制定为:

    来解决这两个问题。
    • 给定开放字符的位置,返回相应结束字符的位置以及该对中包含的打开/关闭对的数量(如果有)。

    我现在不会跳到第二个选项的原因是因为返回两个值会打开许多​​其他问题。您可以使用外部状态变量,或引入一个新类来表示这两个值。它增加了复杂性,但最终在这里添加新类型可能是最好的整体解决方案。

    我不想为你做功课,但希望这有助于你了解下一步需要做些什么。希望这有帮助!

答案 1 :(得分:0)

不幸的是,当前的方法签名没有包含足够的信息用于简单的递归解决方案,因此我将添加一个返回两条信息的辅助方法:1。从startIndex开始的下一个打开的堆栈计数,以及2。处理的最后一个字符的位置。

您需要第二条信息,以便呼叫者可以继续递归呼叫停止的地方。

帮助逻辑:

从startIndex开始,向右走,直到遇到打开或关闭或输入结束。

如果您遇到先关闭,请返回-1以进行计数。如果输入结束,则为0.如果遇到先打开,请继续。

如果您遇到下一个打开,请启动子下。检查suball是否为-1,如果是则中止。否则,更新一个局部变量,该变量记录到目前为止由任何子调用返回的最大堆栈计数。继续进行下一个未处理的角色位置。

如果您遇到下一个输入结束,请返回-1表示计数。

如果您遇到下一个关闭,请返回1 + maxOfSubcalls。

注意:如果未达到输入结束,主例程可能需要再次调用帮助程序。在这种情况下,假设没有-1,将返回maxOfHelper。