Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

Давайте создадим универсальную структуру данных Queue (очередь), которая продемонстрирует все, что вы узнали о дженериках в Go! В отличие от стека (LIFO), очередь следует принципу First-In-First-Out (FIFO) — первый добавленный элемент удаляется первым.

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

  • queue.go: Определите вашу универсальную коллекцию очереди.

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

    • Enqueue(item T) — добавляет элемент в конец очереди
    • Dequeue() (T, bool) — удаляет и возвращает элемент из начала очереди вместе с логическим значением, указывающим на успех (возвращает нулевое значение и false, если очередь пуста)
    • Peek() (T, bool) — возвращает первый элемент без его удаления (тот же шаблон возврата, что и у Dequeue)
    • Size() int — возвращает количество элементов в очереди
    • IsEmpty() bool — возвращает true, если в очереди нет элементов

    Также создайте функцию-конструктор NewQueue[T any]() *Queue[T], которая возвращает указатель на инициализированную пустую очередь.

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

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

    • enqueue [value] — добавить значение в очередь
    • dequeue — удалить и вывести первый элемент (вывести empty, если очередь пуста)
    • peek — вывести первый элемент без удаления (вывести empty, если очередь пуста)
    • size — вывести текущий размер

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

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

  • Строка 1: Индикатор типа (int или string)
  • Следующие строки: Команды до 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

Ваша очередь должна работать одинаково как для целых чисел, так и для строковых типов, демонстрируя, как одна универсальная реализация обрабатывает несколько конкретных типов, сохраняя при этом полную безопасность типов.

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

package main

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

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

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