Соответствие скобок с использованием стеков и Java

1

Здесь мой код для сопоставления скобок. Проблема заключается в том, что он всегда возвращает 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());
    }
}
  • 4
    Что это? Кто-то использовал String.equals() ... правильно?
  • 1
    Добавьте несколько операторов println в ваш код и / или отладьте его. Знание того, как находить ошибки в вашем коде, является одной из первых вещей, которую вы должны изучить.
Теги:
data-structures
stack

3 ответа

1
Лучший ответ

Он всегда возвращает false из-за этой строки:

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

Массив, который вы проверяете, это {"{","{","}","}"}. Программа работает как для { s, но когда вы сталкиваетесь с первым }, match_Stack.topAndpop() возвращает "}" и поэтому мы проверяем,

"{".equals("}")

Это неверно.

Чтобы исправить это, вам нужно проверить, соответствует ли закрывающая скобка первому. Вот несколько способов сделать это:

  • Если вы берете символы, '}' - 2 и ']' - 2 являются соответствующими открывающими скобками, но ')' - 1 является открывающей скобкой из-за ASCII. Это может быть одна возможность для проверки равенства.
  • Вы можете создать Map и сопоставить закрывающие скобки с открывающимися, а затем посмотреть, является ли yourmapname.get(array_match[i]) верхним элементом стека.
  • Вы можете сделать другой метод, который берет обе строки и проверки, если они совпадают.

Кроме того, есть ли причина, по которой вы используете ArrayStack вместо Stack? Кроме того, есть ли причина, почему вы используете массив строк вместо String или char[]? Также обратите внимание, что вы можете сделать это без стека, посчитав открывающие скобки, вычитая на закрывающие и отслеживая последний тип открывающего кронштейна, чтобы вы могли убедиться, что нет совпадающих скобок (например, ([)])

  • 0
    Я не understand.I следует проверить , если Popped элемент соответствует одному в настоящее время в array_match.I преобразовал Popped быть String.And array_match также String.Then , почему я не могу сравнить их с равными? Почему "{".equals("}") ложь
  • 0
    @sam_rox { же, как } ? String#equals возвращает true тогда и только тогда, когда две строки в точности равны. "abc".equals("ABC") является ложным. Но "{".equals("{") верно, потому что символ тот же. "{".equals("}") ложно, потому что символ другой; они указывают в противоположных направлениях.
Показать ещё 3 комментария
0
  1. Я не уверен, почему вы используете класс Apache для Stack, когда Java имеет совершенно хороший общий Stack.
  2. Если вы выполняете одиночные сравнения символов, вам не нужно сравнивать String, но я предполагаю, что у вас есть причины для этого.
  3. Как уже упоминалось в других ответах, вы соответствуете открытию с закрывающимися скобками. Один из способов, которым вы можете исправить это, - это нажать противоположный тип кронштейна.
  4. Если вы пытаетесь определить, есть ли у вас полное правильное совпадение, логика не совсем правильная.

Вот один из возможных способов переписать это.

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());
    }
}
0

Это условие неверно:

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

Вы проверяете, соответствует ли закрывающая скобка открывающей скобке (которая, очевидно, не будет истина - "{".equals("}") == false), а не проверяет, совпадают ли эти два - я оставлю это вы должны выяснить, как это сделать.

  • 0
    Черт, ты заметил это прямо передо мной.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню