java - 使用包含括号的列表将特定括号(左括号、右括号)存储在堆栈中

标签 java list stack

    static List<String> openingBrackets = new ArrayList<String>();
    static List<String> closingBrackets = new ArrayList<String>();

    public static final String quit = ""; // to be used in sentinel loop

    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);

        // list containing all the opening brackets
        openingBrackets.add("(");
        openingBrackets.add("{");
        openingBrackets.add("[");
        openingBrackets.add("<");
        System.out.println(openingBrackets);

        // list that contains the closing brackets
        closingBrackets.add(")");
        closingBrackets.add("}");
        closingBrackets.add("]");
        closingBrackets.add(">");
        System.out.println(closingBrackets);

        String sent = "value"; // some dummy value assigned to sent.

        // creating a stack to store the opening brackets
        Stack stackOpening = new Stack();

        // creating a stack to store the closing brackets
        Stack stackClosing = new Stack(); 

        while (!sent.equals(quit))
        {
            System.out.println("Enter a string to test:");
            sent = scanner.nextLine();

            for (int i=0; i<sent.length(); i++)
            {
                char c = sent.charAt(i);

                if (! openingBrackets.contains(c))
                {
                    // push the opening brackets in the String sent 
                    // in the Stack for opening brackets

                    stackOpening.push(c); 
                }

                if (! closingBrackets.contains(c))
                {
                    // push only the closing brackets in the String
                    // in the stack for closing brackets

                    stackClosing.push(c);
                }
            }
        }
    }
}

Sample input:

  • (< [ { } ( { > ) ] >

Sample output:

  • 堆栈(用于左括号):[ (, <, [, {, }, (, { ]
  • 堆栈(用于右括号):[ >, ), ], > ]

However, when printing the two stacks separately; it outputs

  • [ (, <, [, {, }, (, {, >, ), ], > ]对于两个堆栈

最佳答案

openingBrackets openingBracketsCollection s of Strings。无论您如何检查,这些集合是否包含 Character s:

char c = sent.charAt(i);

if (! openingBrackets.contains(c))

由于Collection不包含任何Character,因此找不到匹配项,这就是为什么所有元素都添加到两个Stack中的原因。

要解决此问题,请在测试之前创建 openingBracketslookingBrackets CollectionCharacter 或将 c 转换为 String(如果它包含在这些 Collection 之一中)。

(大多数 Collection 使用 equals 方法检查它们是否包含元素,对于 StringCharacter 仅返回 true(如果两个实例属于同一类型)

关于java - 使用包含括号的列表将特定括号(左括号、右括号)存储在堆栈中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32922906/

相关文章:

java - 为什么 Lambda 在初始化后生成相同的加密 key 以及如何修复它?

java - 提取菜单链接

java - 从列表中删除第一个 'n' 元素而不进行迭代

java - 使用 Java Streams 将映射列表转换为列表映射

c++ - 在两个线程中使用 C++ 堆栈

java - 使用 Consumers=MediaType.APPLICATION_JSON_VALUE 时的 415 状态代码

java - @Singleton @Startup @PostConstruct 方法允许阻塞吗?

python - 将奇数指数乘以 2?

java - 为什么使用 Character.isAlphabetic() 时我的字母字符没有添加到堆栈中?

.net - 在Microsoft的CLR中,用于异步方法调用的ref值类型参数存储在哪里?