java中的括号检查器

java中的括号检查器,java,stack,parentheses,Java,Stack,Parentheses,我用java编写了一个括号检查器程序,该程序从标准输入读取文本流,并使用堆栈确定其括号是否正确平衡。例如,它应该为[()]{}{[()()]()}打印true,为[(])打印false。我为这个问题创建了自己的堆栈类: public class Stack { private char items[]; private int top; Stack(int n){ items = new char[n]; top = -1; } void push(char c){

我用java编写了一个括号检查器程序,该程序从标准输入读取文本流,并使用堆栈确定其括号是否正确平衡。例如,它应该为
[()]{}{[()()]()}
打印true,为
[(])
打印false。我为这个问题创建了自己的堆栈类:

public class Stack {
private char items[];
private int top;

Stack(int n){
    items = new char[n];
    top = -1; 
}

void push(char c){
    if(top == items.length-1){
        System.out.println("Stack full.");
        return;
    }
    top++;
    items[top] = c;
}

char pop(){
    if(isEmpty()){
        System.out.println("Stack empty");
        return (char)0;
    }
    char p;
    p = items[top];
    top--;
    return p;
}

boolean isEmpty(){
    if(top == -1)
        return true;
    else    
        return false;
}
}

下面的
checkValid
方法接受字符串输入,如果括号匹配,则返回true;如果括号不匹配,则返回false

    public static Boolean checkValid(String str){
        char sym,prev;
        Stack s = new Stack(str.length());
        for(int i=0; i<str.length();i++){
            sym = str.charAt(i);
            if(sym == '(' || sym=='{' || sym=='['){
                s.push(sym);
            }
            if(sym == ')' || sym=='}' || sym==']'){
               if(s.isEmpty()){
                   return false;
                }
               else{
                    prev = s.pop();
                    if(!isPairMatch(prev,sym))
                        return false;
               }
            }

        }
        if(!s.isEmpty())
            return false;
        return true;
    }
    public static boolean isPairMatch(char character1, char character2){
        if(character1 == '(' && character2 == ')')
            return true;
        else if(character1 == '{' && character2 == '}')
            return true;
        else if(character1 == '[' && character2 == ']')
            return true;
        else
            return false;
    }
}
公共静态布尔校验有效(字符串str){
char-sym,prev;
堆栈s=新堆栈(str.length());

对于(int i=0;i,如果堆栈不是保存
chars
,而是保存一个类,该类在输入字符串中同时包含
char
和该
char
的索引,则可以打印不匹配括号的索引

编辑:

仅当您希望两个未通过
isPairMatch
测试的不匹配括号的索引时,才需要此解决方案

例如,如果有字符串“[{}{}{}”,则不匹配的对是第一个“[”和最后一个“)”,其索引为0和7


如果只需要第一个不匹配括号的索引(即索引为0的第一个“[”),您只需在删除括号后检查堆栈的大小。在本例中,检查最后一对时,堆栈将为空,因此堆栈的大小将为0,这是失败的
isPairMatch
测试的第一个字符的索引。

那么,不匹配的括号的位置应与堆栈的大小(或“大小-1”)。然后程序是否能够检查某个特定的开始括号是否有正确的结束括号?您需要一个映射,其中k是索引,v是值,即括号。@rick112358您的算法将保持不变。唯一的区别是不是(例如)按{'到堆栈中,您将推送新项目({',4)。
isPairMatch
将接收两个项目而不是两个字符,如果存储在这些项目中的字符对不匹配,您可以打印这些字符的索引。我只能使用堆栈。不允许使用映射