Java 如何使用堆栈检查字符串

Java 如何使用堆栈检查字符串,java,Java,我有一些具体的任务。我们有类似字符串的“(()[])”或类似于此的东西。我采访中的一个问题是如何检查字符串是否正确。例如:“([])”-true,“([)”-false,“[(])”-false,“([])”-true。非常感谢你们! 我不能接受我的代码有什么问题。 谢谢大家!!! 请帮忙 导入java.util.Stack 公开课考试{ public static void main(String[] args) { String line = "(<>()[])";

我有一些具体的任务。我们有类似字符串的“(()[])”或类似于此的东西。我采访中的一个问题是如何检查字符串是否正确。例如:“([])”-true,“([)”-false,“[(])”-false,“([])”-true。非常感谢你们! 我不能接受我的代码有什么问题。 谢谢大家!!! 请帮忙

导入java.util.Stack

公开课考试{

public static void main(String[] args) {

    String line = "(<>()[])";
    Test test = new Test();
    boolean res = test.stringChecker(line);
    System.out.println(res);
}

public boolean stringChecker(String line){
    boolean result = false;
    char letter = '\u0000';
    char[] arr = line.toCharArray();
    Stack<Character> stack = new Stack();

    for (int i = 0; i < arr.length; i++) {
        if (arr[i] == '(' || arr[i] == '[' || arr[i] == '<') {
            stack.push(arr[i]);
        }
        if(arr[i] == ')' || arr[i] == ']' || arr[i] == '>'){
                if(stack.peek() == arr[i]){
                    result = true;
                    stack.pop();

            }
        }
    }

    return result;
}
publicstaticvoidmain(字符串[]args){
字符串行=“(()[])”;
测试=新测试();
布尔res=test.stringChecker(行);
系统输出打印项次(res);
}
公共布尔字符串检查器(字符串行){
布尔结果=假;
字符字母='\u0000';
char[]arr=line.toCharArray();
堆栈=新堆栈();
对于(int i=0;i
}(0)您正在推<(和{但在您的窥视中,您正在检查>,)和}

(1) 第一次成功匹配时,您将以结果false开始,并将其设置为true。相反,您应该以结果true开始,并在第一次失败匹配时将其设置为false

(2) 当字符用完时,应检查堆栈是否为空

(3) 在偷看之前,应该检查堆栈是否为空


(4) 您可能需要检查不需要的字符。

除了@TheodoreNorvell的解释之外,这里还介绍了实现的外观

public boolean stringChecker(String input) {
    boolean result = true;
    char[] arr = input.toCharArray();
    Stack<Character> stack = new Stack<>();
    try {
        for (int i = 0; result && i < arr.length; i++) {
            if (arr[i] == '(' || arr[i] == '[' || arr[i] == '<') {
                stack.push(arr[i]);
            } else if(arr[i] == ')') {
                Character c = stack.pop();
                result = c.equals('(');
            } else if(arr[i] == ']') {
                Character c = stack.pop();
                result = c.equals('[');
            } else if(arr[i] == '>') {
                Character c = stack.pop();
                result = c.equals('<');
            } else {
                // found some char that is not allowed
                // here it is not just ignored,
                // it invalidates the input  
                result = false;
            }
        }
        // when the teher is not more chars in the array
        // the stack has to be empty 
        result = result  && stack.isEmpty() ;
    } catch(EmptyStackException e) {
        // found a closing bracket in the array 
        // but there is nothing on the stack
        result = false;
    }
    return result;
}

@Test
public void stringChecker() {
    Assert.assertTrue(stringChecker("[]"));
    Assert.assertTrue(stringChecker("[(<>)]"));
    Assert.assertFalse(stringChecker("([<>)]"));
    Assert.assertFalse(stringChecker(">"));
    // invalid char
    Assert.assertFalse(stringChecker("<[]e>"));
    // stack is not empty
    Assert.assertFalse(stringChecker("("));
}
公共布尔字符串检查器(字符串输入){
布尔结果=真;
char[]arr=input.toCharArray();
堆栈=新堆栈();
试一试{
对于(int i=0;result&&iresult=c.equals('感谢您的编辑不幸的是,我是AFK,所以我无法批准它。我已经编辑了我的答案以显示完整的代码,请随意再次改进它!