https://coderun.yandex.ru/problem/correct-bracket-sequence/description Легкая

Условие

Рассмотрим последовательность, состоящую из круглых, квадратных и фигурных скобок. Программа дожна определить, является ли данная скобочная последовательность правильной.

• Пустая последовательность явлется правильной.

• Если A — правильная последовательность, то последовательности (A)[A]{A} — правильные.

• Если A и B — правильные последовательности, то последовательность AB — правильная.

Примеры

Ввод: ()[] Вывод: yes

Ввод: ([)] Вывод: no

Ввод: ( Вывод: no

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.util.Stack

// Функция проверки соответствия открывающей и закрывающей скобок
fun matches(open: Char, close: Char): Boolean =
    open == '(' && close == ')' ||
    open == '[' && close == ']' ||
    open == '{' && close == '}'

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    val s = reader.readLine()
    val stack = Stack<Char>()

    // Проходим по каждому символу в строке
    for (c in s) {
        when (c) {
            // Если скобка открывающая, добавляем её в стек
            '(', '[', '{' -> stack.push(c)

            // Если скобка закрывающая, проверяем соответствие
            ')', ']', '}' -> {
                if (stack.isEmpty() || !matches(stack.pop(), c)) {
                    writer.write("no")
                    writer.flush()
                    return
                }
            }
        }
    }

    // Проверяем, пуст ли стек (все скобки корректно закрыты)
    if (stack.isEmpty()) writer.write("yes")
    else writer.write("no")

    writer.flush()
}