Menu
Coddy logo textTech

Итоги — Обобщенная коллекция

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

challenge icon

Задание

Легко

Давайте создадим generic структуру данных Queue, которая продемонстрирует всё, что вы узнали о generics в Go! В отличие от стека (LIFO), queue соблюдает порядок First-In-First-Out (FIFO): первый добавленный item удаляется первым.

Вы организуете свой код в двух файлах:

  • queue.go: Define свою generic коллекцию queue.

    Создайте generic структуру Queue[T any], которая хранит items internally. Ваша queue должна поддерживать следующие операции:

    • Enqueue(item T) — adds item в back queue
    • Dequeue() (T, bool) — удаляет и возвращает item из front queue вместе с boolean, указывающим на успешность операции (возвращает нулевое значение и false, если queue empty)
    • Peek() (T, bool) — возвращает front item, не удаляя его (та же схема возврата, что и у Dequeue)
    • Size() int — возвращает number items в queue
    • IsEmpty() bool — возвращает true, если queue has no items

    Также создайте constructor function NewQueue[T any]() *Queue[T], которая возвращает pointer на initialized empty queue.

  • main.go: Продемонстрируйте работу queue с разными типами на основе входных данных.

    Прочитайте indicator типа (int или string), затем прочитайте ряд commands, которые нужно выполнить над queue. Каждая command находится в отдельной строке:

    • enqueue [value] — Add value в queue
    • dequeue — удаляет и выводит front item (выведите empty, если queue empty)
    • peek — выводит front item, не удаляя его (выведите empty, если queue empty)
    • size — выводит текущий size

    Читайте commands, пока не получите done.

Будут предоставлены следующие входные данные:

  • Строка 1: Type indicator (int или string)
  • Следующие строки: Commands до done

Например, для следующих входных данных:

int
enqueue 10
enqueue 20
enqueue 30
peek
dequeue
size
dequeue
dequeue
dequeue
done

Ваш вывод должен быть таким:

10
10
2
20
30
empty

А для следующих входных данных:

string
enqueue hello
enqueue world
size
peek
dequeue
peek
done

Ваш вывод должен быть таким:

2
hello
hello
world

Ваша queue должна работать одинаково для integer и string типов, демонстрируя, как одна generic реализация обрабатывает несколько concrete типов, сохраняя полную type safety.

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

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Прочитать индикатор типа
	scanner.Scan()
	typeIndicator := scanner.Text()
	
	if typeIndicator == "int" {
		// TODO: Создать очередь целых чисел с помощью NewQueue[int]()
		// Обработать команды для очереди целых чисел
		
		for scanner.Scan() {
			line := scanner.Text()
			if line == "done" {
				break
			}
			
			parts := strings.SplitN(line, " ", 2)
			command := parts[0]
			
			// TODO: Обработать команды: enqueue, dequeue, peek, size
			// Для enqueue разобрать целочисленное значение из parts[1]
			// Для dequeue/peek вывести "empty", если очередь пуста
			_ = command
		}
	} else if typeIndicator == "string" {
		// TODO: Создать очередь строк с помощью NewQueue[string]()
		// Обработать команды для очереди строк
		
		for scanner.Scan() {
			line := scanner.Text()
			if line == "done" {
				break
			}
			
			parts := strings.SplitN(line, " ", 2)
			command := parts[0]
			
			// TODO: Обработать команды: enqueue, dequeue, peek, size
			// Для enqueue использовать строковое значение из parts[1]
			// Для dequeue/peek вывести "empty", если очередь пуста
			_ = command
		}
	}
	
	// Они здесь, чтобы избежать ошибок неиспользуемых импортов во время разработки
	_ = strconv.Atoi
	_ = fmt.Println
}

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

Потренируйтесь самостоятельно: Онлайн-компилятор Go