Любая причина, почему мой метод, чтобы проверить, есть ли даже скобка et c не работает? - PullRequest
1 голос
/ 02 апреля 2020

Я создал программу, которая имеет дело с просьбой пользователя ввести уравнение, например {x + (y - 2) * 1} + [a + b], и проверкой, закрываются ли все скобки и скобки et c. Если мой метод обнаружит, что он закрывается, он напечатает: Выражение: {x + (y - 2) * 1} + [a + b] -> сбалансировано. Моя проблема в том, что мой метод, по-видимому, каждый раз по умолчанию не сбалансирован, поэтому я подозреваю, что это проблема в методе isBalanced. Может кто-нибудь просто дать мне знать, если мой синтаксис неправильный? Кажется, все хорошо, когда я читаю. Вот мой код:

import java.util.*;
import java.io.*;
public class BalancedParanthesis {
        static String expressions[];
        static class    MyArrayStack{
            int top = -1;
            char brackets[] = new char[100];
            void push(char x) {
                if(top ==99) {
                    System.out.print("Stack full");
                }
                else {
                    brackets[++top] = x;
                }
                }
            char pop() {
                if(top ==-1) {
                    System.out.println("ERROR:Stack undeflow error");
                    return '\0';
                }
                else {
                    char element = brackets[top];
                    top--;
                    return element; 
                }
            }

            boolean isEmpty() {
                return(top==-1)?true:false;
            }
        }
        static boolean isMatchingPair(char bracketOne,char bracketTwo) {
            if(bracketOne=='('&& bracketTwo ==')') {
                return true;
            }
            else if(bracketOne == '{'&& bracketTwo == '}') {
                return true;
            }
            else if(bracketOne == '['&& bracketTwo ==']') {
                return true;
            }
            else {
                return false;
            }

        }
        static boolean isBalanced(String expression) {
            MyArrayStack st =new MyArrayStack();
            for(int index = 0; index<expression.length();index++) {
                if(expression.charAt(index)=='{'|| expression.charAt(index)=='(' || expression.charAt(index)=='{') {
                    st.push(expression.charAt(index));
                }
                if(expression.charAt(index)=='}'|| expression.charAt(index)==')'||expression.charAt(index)=='}'){
                        if(st.isEmpty()) {
                            return false;
                        }
                }
                else if(!isMatchingPair(st.pop(),expression.charAt(index))) {
                    return false;
                }
            }
            if(st.isEmpty()) {
                return true;
            }
            else {
                return false;
            }
        }
        public static void main(String[] args) {
            System.out.println("Input: ");
            Scanner input = new Scanner(System.in);
            String x = input.next();
            if(isBalanced(x)) {
                System.out.println("\n Expression: " + x + " is balanced");
            }
            else {
                System.out.println("\n Expression: " + x + " is not balanced");
            }
        }

        }

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

См. Logi c fl aws в комментариях:

// why are we checking for `{` twice here?
if(expression.charAt(index)=='{'|| expression.charAt(index)=='(' || expression.charAt(index)=='{') {
    st.push(expression.charAt(index));
} // missing 'else' here, maybe??
// why are we checking for `}` twice here?
if(expression.charAt(index)=='}'|| expression.charAt(index)==')'||expression.charAt(index)=='}'){
    if(st.isEmpty()) {
        return false;
    }
    // shouldn't we be calling pop() and isMatchingPair() here?
}
// here we know that charAt(index) is not a ')' or '}',
// so why are we calling pop() and isMatchingPair()?
else if(!isMatchingPair(st.pop(),expression.charAt(index))) {
    return false;
}
// isEmpty() returns a boolean, so why not return it directly?
if(st.isEmpty()) {
    return true;
}
else {
    return false;
}

Для лучшей производительности и ясность кода, звоните только expression.charAt(index) один раз.

char ch = expression.charAt(index);
if (ch == '(' || ch == '{' || ch == '[') {
    st.push(ch);
} else if (ch == ')' || ch == '}' || ch == ']'){
    if (st.isEmpty()) {
        return false;
    }
    if (! isMatchingPair(st.pop(), ch)) {
        return false;
    }
}
return st.isEmpty();
0 голосов
/ 02 апреля 2020

Довольно странный код, просто прочитайте его как строку. Преобразовать в массив символов. Три целых числа для (, {, [. Если char есть),},], тогда делайте -1 в соответствующем int. Если все три целых числа равны 0, термин правильный!

public static boolean validate(String s) {
    int bracket = 0;
    int squareBracket = 0;
    int brace = 0;
    for(char c : s.toCharArray()) {
        switch (c) {
            case '(': bracket++; break;
            case ')': bracket--; break;
            case '[': squareBracket++; break;
            case ']': squareBracket--; break;
            case '{': brace++; break;
            case '}': brace--; break;
            default: break;
        }
    }
    return(bracket == 0 && squareBracket == 0 && brace == 0);
}
...