【问题标题】:Parenthesis checker in javajava中的括号检查器
【发布时间】:2014-11-04 09:57:16
【问题描述】:

我在 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;
    }
}

有没有办法打印不匹配括号的位置?

【问题讨论】:

  • 嗯,不匹配括号的位置应该和栈的大小一样(或者“size - 1”)。

标签: java stack parentheses


【解决方案1】:

如果您的堆栈不是保存chars,而是保存一个在输入字符串中同时包含char 和该char 索引的类,您将能够打印不匹配的索引括号。

编辑:

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

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

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

【讨论】:

  • 那么程序能否检查特定开头的右括号是否正确?
  • 你需要一个 Map 其中 k 是索引,v 是值,即括号。
  • @rick112358 您的算法将保持不变。唯一的区别是,不是(例如)将“{”推送到堆栈,而是推送 new Item('{',4)。 isPairMatch 将收到两个项目而不是两个字符,如果存储在这些项目中的一对字符不匹配,您可以打印这些字符的索引。
  • 我只能使用堆栈.. 不允许使用地图
猜你喜欢
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 2022-01-02
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多