使用堆栈和java匹配的括号

时间:2014-05-16 04:29:08

标签: java data-structures stack

这是我的匹配括号的代码。问题是它总是返回false 我无法看出错误在哪里 topAndpop()返回堆栈的顶部值及其Object类型  有人可以告诉我这个错误。

public class Matching {
    ArrayStack match_Stack=new ArrayStack();
    Object popped;
    String[] array_match={"{","{","}","}"};
    public boolean matching() throws OverFlowException,EmptyStackException {
        boolean isMatch=false;
        for(int i=0;i< array_match.length;i++) {
            if (array_match[i].equals("{") || array_match[i].equals("[") ||array_match[i].equals("("))   
                match_Stack.push(array_match[i]);

            if(array_match[i].equals("}") || array_match[i].equals("]") ||array_match[i].equals(")") )  {
                if (match_Stack.isEmpty())
                    return false;
                if  (String.valueOf(match_Stack.topAndpop()).equals(String.valueOf(array_match[i]))) {

                    isMatch=true;
                } else {
                    isMatch=false;
                    return isMatch;
                }
            }
        }   
        return isMatch; 
    }

    public static void main (String args[]) throws EmptyStackException,OverFlowException {
        Matching a=new Matching();
        System.out.println(a.matching());
    }
}

3 个答案:

答案 0 :(得分:1)

由于这一行,它总是返回false:

if (String.valueOf(match_Stack.topAndpop()).equals(String.valueOf(array_match[i]))){

您正在检查的数组是{"{","{","}","}"}。该程序适用于{,但当您遇到第一个}时,match_Stack.topAndpop()会返回"}",因此我们会检查是否

"{".equals("}")

哪个是假的。

要解决此问题,您需要检查右括号是否与开头括号匹配。以下是一些方法:

  • 如果您使用字符,'}' - 2']' - 2是相应的左括号,但由于ASCII')' - 1是左括号。这可能是检查平等的一种可能性。
  • 您可以创建Map并将结束括号映射到开头的括号,然后查看yourmapname.get(array_match[i])是否是堆栈的顶部元素。
  • 您可以创建另一种方法,即接收字符串并检查它们是否匹配。

此外,您使用ArrayStack代替Stack是否有任何理由?另外,您是否有理由使用字符串数组而不是Stringchar[]?另外,请注意,您可以通过计算左括号,减去关闭的括号,并跟踪最后一种类型的左括号来执行此操作,以便您可以确保没有重叠的括号(如([)])< / p>

答案 1 :(得分:0)

这种情况是错误的:

String.valueOf(match_Stack.topAndpop()).equals(String.valueOf(array_match[i]))

您正在检查结束括号是否等于左括号(显然不会是真的 - "{".equals("}") == false),而不是检查两个是否匹配 - 我会留给你弄清楚如何做到这一点。

答案 2 :(得分:0)

  1. 当我有一个非常好的通用Stack时,我不确定你为什么要使用Apache的Stack类。
  2. 如果您正在进行单字符比较,则不需要字符串比较,但我会假设您有理由这样做。
  3. 正如其他答案所提到的那样,您将使用右括号匹配开头。解决这个问题的一种方法是推动相反类型的支架。
  4. 如果您正在尝试确定是否具有完整,正确的匹配,则逻辑不太正确。
  5. 这是重写此内容的一种可能方法。

    import java.util.*;
    
    public class Matching{
        Stack<String> match_Stack=new Stack<String>();
        Object popped;
        String[] array_match={"{","{","}","}"};
        Map<String, String> opposites;
    
        public boolean matching() {
            // create the mapping
            opposites = new HashMap<String,String>();
            opposites.put("{", "}");
            opposites.put("[", "]");
            opposites.put("(", ")");
    
    
            for(int i=0;i< array_match.length;i++){
                String s = array_match[i];
                if (s.equals("{") || s.equals("[") ||s.equals("("))   
                    match_Stack.push(opposites.get(s));
    
                else if (s.equals("}") || s.equals("]") || s.equals(")")) {
                    if (match_Stack.isEmpty() || !match_Stack.pop().equals(s))
                        return false;
                }
            }   
            return match_Stack.empty();
        }
        public static void main (String args[]) {
            Matching a=new Matching();
            System.out.println(a.matching());
    
        }
    }
    

    使用char代替String,这是另一种可以说更直观的实现。

    import java.util.*;
    
    public class MatchingChar{
        Stack<Character> match_Stack = new Stack<Character>();
        Object popped;
        String input = "{{}}";
        Map<String, String> opposites;
    
        public boolean matching() {
            opposites = new HashMap<,String>();
            opposites.put('{', '}');
            opposites.put('[', ']');
            opposites.put('(', ')');
    
    
            for(int i=0;i< input.length();i++){
                char s = input.charAt(i);
                if (s == '{' || s == '[' ||s == '(')   
                    match_Stack.push(opposites.get(s));
    
                else if (s == '}' || s == ']' || s == ')') {
                    if (match_Stack.isEmpty() || !match_Stack.pop() == s)
                        return false;
                }
            }   
    
            // If the stack here, that means all grouping operators were matched correctly
            return match_Stack.empty();
        }
    
        public static void main (String args[]) {
            Matching a= new Matching();
            System.out.println(a.matching());
        }
    }