Java 平衡括号:

Java 平衡括号:,java,algorithm,Java,Algorithm,我试图解决一个平衡圆括号的问题,但遇到了错误。我不知道为什么我会得到错误的答案,因为我的逻辑是正确的。我很长时间都在试图解决这个问题,但没有办法。这是我的java代码: public class Solution { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); for(int i=0; i

我试图解决一个平衡圆括号的问题,但遇到了错误。我不知道为什么我会得到错误的答案,因为我的逻辑是正确的。我很长时间都在试图解决这个问题,但没有办法。这是我的java代码:

public class Solution {

    public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();

        for(int i=0; i<n;i++){
             Stack<Character> stack=new Stack<Character>();
        char x,y;
           for(int j=0; j<stack.size();j++){ 
           x=sc.next().charAt(j);
           y=stack.peek();
           if(x=='{' || x=='[' || x=='('){
                stack.push(x);
            }

            if(x=='}'){
                if(y=='{'){
                    stack.pop();
                //    System.out.println("Yes");
                }
               // else{
                 //   System.out.println("No");
               //}

            }else if(x==']'){
                if(y=='['){
                    stack.pop();

                }
            }else if(x==')'){   
                if(y=='('){
                    stack.pop();
                //    System.out.println("Yes");
                }
            }
          }
         if(stack.empty()==true){
         System.out.println("YES");

    }else if(stack.empty()!=true){
         System.out.println("NO");   
        }
    }


    }
}
公共类解决方案{
公共静态void main(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
int n=sc.nextInt();
对于(int i=0;i
在将任何内容放入堆栈之前,
stack.peek()
也有一个问题,这会引发异常。您应该使用以下内容检查这种情况:

Stack<Character> stack=new Stack<Character>();
char x,y;
String text = sc.next();
for(int j = 0; j < text.length(); j++){ 
    x=text.charAt(j);
y = stack.empty() ? '\0' : stack.peek();

如果堆栈上没有任何内容,它将使用默认值(永远不会匹配右括号)。

没有错误。我在几个测试用例中得到了错误的答案。测试用例:3{[()]}{[(])}{{[(())]}{{[[(())]}对于上面的测试用例,它应该打印YES NO YES,但它正在打印YES YES Swell,你的第一句话提到了一个错误…修复你的缩进。如果你的代码“结束得太偏右”:拆分出一个方法。如果没有输入规范(或至少是链接),我们只能猜测:盯着
sc.next().charAt(j)
;最好让平衡的paren检查
bool
函数并打印“是”或“否”根据返回值。目前,您的检查仅基于堆栈末尾的状态,但您忽略了堆栈上括号类型错误的情况。您还应该检查堆栈下溢。我不熟悉Java,但假设
sc.next
获取下一个标记(或“word”)从流中。这意味着你推进了两件事:令牌和字母。然而,还有一点赞成编写一个单独的函数来测试单个字符串的平衡性:然后你可以轻松地将
sc.next
作为参数传递,并在同一个字符串上进行所有检查,而目前你没有。我已经更改了代码,它们的方式是至少你已经告诉我了。现在没有输出了。@RaquibaSultana你的
堆栈.peek()有一个bug
部分。我已经为该部分添加了一个修复程序。还有一件事:
Deque
接口及其实现提供了一组更完整、一致的后进先出堆栈操作,应该优先使用该类。(避免使用遗留类和不推荐使用的部分。)
y = stack.empty() ? '\0' : stack.peek();