Menu
Coddy logo textTech

Повторение — очередь с приоритетом

Часть раздела Объектно-ориентированное программирование путешествия по Kotlin на Coddy. Урок 41 из 57.

challenge icon

Задание

Средне

Создайте приоритетную очередь, работающую с любым типом, поддерживающим приоритет. Prioritized (с priority), а также классы данных Job и Ticket предоставлены.

  • TaskQueue<T : Prioritized> имеет методы push(item), pop() и peek(), которые удаляют или возвращают элемент с наивысшим приоритетом (при одинаковых приоритетах — тот, который был добавлен первым) либо null, свойство size, метод items() (доступный только для чтения снимок в порядке извлечения) и метод drain(n), который извлекает не более n элементов и возвращает их как List<T>.
  • Обобщённая функция countUrgent(queue, min) принимает очередь любого типа, поддерживающего приоритет, и возвращает количество её элементов, приоритет которых не меньше указанного.

Предоставленный код считывает команды job build 3, ticket 17 5 ada, pop jobs, peek tickets, drain 2 (для билетов) или sizes, выводит каждый ответ и в конце urgent: с количеством срочных заданий и билетов, которые всё ещё находятся в очереди.

Ваш код должен находиться в файлах TaskQueue.kt, Prioritized.kt, Job.kt и Ticket.kt. В Main.kt содержится предоставленный код ввода/вывода, и его нельзя изменять.

Попробуйте сами

fun main() {
    // Предоставленный код ввода/вывода: оставьте его как есть
    val input = generateSequence(::readLine).toList()
    val jobs = TaskQueue<Job>()
    val tickets = TaskQueue<Ticket>()
    for (cmd in input) {
        val p = cmd.split(" ")
        when (p[0]) {
            "job" -> jobs.push(Job(p[1], p[2].toInt()))
            "ticket" -> tickets.push(Ticket(p[1].toInt(), p[2].toInt(), p[3]))
            "pop" -> println("popped " + (if (p[1] == "jobs") jobs.pop() else tickets.pop()))
            "peek" -> println("next " + (if (p[1] == "jobs") jobs.peek() else tickets.peek()))
            "drain" -> println("drained " + tickets.drain(p[1].toInt()).map { it.customer })
            else -> println("jobs ${jobs.size}, tickets ${tickets.size}")
        }
    }
    println("urgent: ${countUrgent(jobs, 4) + countUrgent(tickets, 4)}")
}

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Песочница Kotlin