当前位置: 首页 > 知识库问答 >
问题:

如何使用堆栈检查字符串

斜宁
2023-03-14

我有一些具体的任务。我们有像“(()[]

导入java.util.栈;

公开课考试{

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

}

共有2个答案

蔺德曜
2023-03-14

除了@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("("));
}

注意,在这种情况下,switch case语句比if-else-if-else更优雅。

百里光熙
2023-03-14

(0)你在推

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

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

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

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

 类似资料:
  • 嘿,伙计们,我有一个任务,我应该读取用户输入的字符串,并使用堆栈检查平衡符号。因此,如果字符串是“{[()]}”,那么字符串是平衡的,因为每个开口都有一个闭合。我的想法是使用一个循环来检查给定字符串中的每个字符,如果该字符串有一个开瓶器,比如“([{”那么它确实是stack.push(char),如果该字符是一个closer”)]}”,那么我需要使用stack。pop(char)。我遇到的问题是,

  • 问题描述 (Problem Description) 如何使用堆栈反转字符串? 解决方案 (Solution) 下面的示例演示了如何在用户定义的方法StringReverserThroughStack()的帮助下使用堆栈来反转字符串。 import java.io.IOException; public class StringReverserThroughStack { private S

  • 问题内容: 我有一个堆栈A,我想创建一个与堆栈A相同的堆栈B。​​我不希望堆栈B只是指向A的指针- 我实际上是想创建一个包含相同元素的新堆栈B堆栈A的顺序与堆栈A相同。堆栈A是字符串的堆栈。 谢谢! 问题答案: 只需使用Stack类的clone()方法(它实现Cloneable)。 这是一个使用JUnit的简单测试用例: 编辑: tmsimont:这会为我创建“未经检查或不安全的操作”警告。有什么

  • 问题内容: 嗨,我正在尝试使用另一个空堆栈反转堆栈(我自己编写了一个堆栈)。由于某种原因,它无法正常工作。谁能帮我这个 ? 问题答案: while(!stack1.isEmpty()){ Integer value = (Integer)stack1.pop(); System.out.println(value); reverse.push(value); }

  • 问题内容: 将结果转换为描述堆栈跟踪的字符串的最简单方法是什么? 问题答案: 可以使用以下方法将堆栈跟踪转换为。此类可在Apache commons-lang中找到,它是最常见的依赖库,具有许多流行的开源代码

  • 问题内容: 有什么方法可以将堆栈跟踪作为字符串获取? 查看调试包(https://golang.org/pkg/runtime/debug/),它只能打印到标准输出。 问题答案: 将格式化的堆栈跟踪放到提供的中。然后,您可以将其转换为字符串。 您还可以使用,分配足够大的缓冲区来容纳整个堆栈跟踪,并使用将该跟踪放入其中,并返回缓冲区()。