Проверка баланса в Java

#java #arrays #data-structures #stack

#java #массивы #структуры данных #стек

Вопрос:

Это код для проверки символа баланса. Однако, когда я пытаюсь вписаться в тестер, он неправильно отображает ответ.

 import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class BalanceCheck {

private static Scanner in;

public static void main(String[] args){
    if(args.length > 0){
        System.out.println(args[0]);
        try {
            in = new Scanner(new File(args[0]));
            MyStack<Character> stack = new MyStack<>();
            String str;
            char ch;
            while(in.hasNext()){
                str = in.next();
                for(int i = 0; i < str.length();   i){
                    ch = str.charAt(i);
                    if(ch == '(' || ch == '[' || ch == '{' || 
                            (ch == '/' amp;amp; i < str.length() - 1 amp;amp; str.charAt(i 1) == '*')){
                        stack.push(ch);
                    }
                    else if(ch == ')'){
                        if(stack.isEmpty() || stack.pop() != ch){
                            System.out.println(") is mismatched");
                            return;
                        }
                    }
                    else if(ch == ']'){
                        if(stack.isEmpty() || stack.pop() != ch){
                            System.out.println("] is mismatched");
                            return;
                        }
                    }
                    else if(ch == '}'){
                        if(stack.isEmpty() || stack.pop() != ch){
                            System.out.println("} is mismatched");
                            return;
                        }
                    }
                    else if(ch == '*' amp;amp; i < str.length() - 1 amp;amp; str.charAt(i 1) == '/'){
                        if(stack.isEmpty() || stack.pop() != '/'){
                            System.out.println("*/ is mismatched");
                            return;
                        }
                    }
                    else if(ch == '"'){
                        if(stack.isEmpty() || stack.top() == '"'){
                            if(!stack.isEmpty())
                                stack.pop();
                        }
                        else{
                            stack.push(ch);
                        }
                    }
                }
            }
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    else{
        System.out.println("Command line argument is not provided..");
    }
}

}
  

Например, если я скомпилирую этот тестер,

 /*this tests an unbalanced [ operator*/
public class Test1 {


/* this is the main method */
public static void main(String[ ) args) {
    String ghana = "hello";
    int test = testing();
}

public int testing() {
    /*checking this too */
    /* and this */ 
    return 1; 
}


}
  

Он должен показывать [ не соответствует. Но он показывает, что /* не соответствует.

Пожалуйста, дайте мне знать решение.

И я должен создать файл тестера для этого кода выше.

Как я могу закодировать тестер для этого?

Спасибо,

Ответ №1:

Подумайте о том, что происходит с самой первой строкой: /*this tests an unbalanced [ operator*/

Когда вы нажимаете ‘*/’, в верхней части стека появляется ‘[‘.

Вам нужно отслеживать, когда вы находитесь внутри комментария, чтобы вы могли игнорировать все до конца.

Всякий раз, когда у вас возникает подобная проблема, вам необходимо использовать отладчик.