Класс "Очередь-FIFO" (продолжение, программа "Танцоры").
Будет два варианта программы:
1) Во входных данных простой список: data = [("Василий", "м"), ("Виталий", "м"), ("Виктор", "м"), ("Пётр", "м"), ("Евгений", "м"), ("Николай", "м"), ("Ирина", "ж"), ("Екатерина", "ж"), ("Евгения", "ж"), ("Анастасия", "ж")];
2) Во втором варианте сложный список: data = [("Василий", "м", 3), ("Виталий", "м", 8), ("Виктор", "м", 7), ("Пётр", "м", 8), ("Евгений", "м", 5), ("Николай", "м", 9), ("Ирина", "ж", 5), ("Екатерина", "ж", 9), ("Евгения", "ж", 9), ("Анастасия", "ж", 4)]
Используя абстрактную структуру данных, такую как "Очередь-FIFO", описанную ранее, нужно в первом случае отобрать мальчиков и девочек по парам для участия в конкурсе танцев.
А во втором случае нужно отобрать участников ещё и по их оценкам.
Мальчики или девочки, которым не хватило партнёров, в конкурсе участвовать не будут.
Пример вывода для первого варианта:
Пример вывода для второго варианта:
"""КЛАСС ОЧЕРЕДЬ-FIFO, который был описан в программе <<<Класс "Очередь-FIFO">>>."""
import copy
class Queue:
def __init__(self):
self.__data = list() # для очереди выбран список
def enqueue(self, item): # добавить элемент в очередь
self.__data.append(item)
def dequeue(self): # убрать первый элемент
if len(self.__data) > 0:
return self.__data.pop(0)
return None # вернуть None, если очередь пуста
def rear(self): # посмотреть последний элемент в очереди
if len(self.__data) > 0:
return self.__data[-1]
return None # вернуть None, если стек пуст
def front(self): # посмотреть первый элемент в очереди
if len(self.__data) > 0:
return self.__data[0]
return None # вернуть None, если стек пуст
def is_empty(self): # проверить пуста ли очередь
return len(self.__data) == 0
def size(self): # узнать размер очереди
return len(self.__data)
def clear(self): # очистить очередь
self.__data = []
def show(self): # вывести очередь в stdout
if self.__data != []:
print("\nОчередь:")
result = "\n".join([str(i) for i in self.__data])
result = result.removesuffix("\n")
print(result)
else:
print("\nОчередь пуста.\n")
#######################################################################################################
########## ПЕРВЫЙ ВАРИАНТ (простой) ###################################################################
#######################################################################################################
print("\nПЕРВЫЙ ВАРИАНТ.\n")
# входные данные
data = [("Василий", "м"), ("Виталий", "м"), ("Виктор", "м"), ("Пётр", "м"), ("Евгений", "м"), ("Николай", "м"),\
("Ирина", "ж"), ("Екатерина", "ж"), ("Евгения", "ж"), ("Анастасия", "ж")]
# создадим 2 очереди
men = Queue()
women = Queue()
# разберём данные по очередям
while data != []:
temp = data.pop(0)
if temp[1] == "м":
men.enqueue(temp[0])
else:
women.enqueue(temp[0])
# составим список танцоров
dance = []
while men.size() > 0 and women.size() > 0:
dance.append((men.dequeue(), women.dequeue()))
# вывод
dance = [" + ".join(i) for i in dance]
print("Пары танцоров:\n ", "\n ".join(dance), "\n\n", "****************************")
#######################################################################################################
########## ВТОРОЙ ВАРИАНТ (сложный) ###################################################################
#######################################################################################################
print("\nВТОРОЙ ВАРИАНТ (сложный).\n")
# входные данные (сложный вариант, в котором каждый танцор имеет оценку)
data = [("Василий", "м", 3), ("Виталий", "м", 8), ("Виктор", "м", 7), ("Пётр", "м", 8), ("Евгений", "м", 5), ("Николай", "м", 9),\
("Ирина", "ж", 5), ("Екатерина", "ж", 9), ("Евгения", "ж", 9), ("Анастасия", "ж", 4)]
# модернизация входных данных (этот блок отсутствует в простом варианте)
eval = sorted([i[-1] for i in data], reverse=True) # --> [10, 9, 9, 9, 8, 8, 7, 5, 5, 4] - список оценок
temp_data = copy.copy(data)
data = []
for a in eval:
for b in temp_data:
if a in b:
data.append(b)
temp_data.remove(b)
break
# код ниже повторяет код из простого варианта, отличаться будет только результат обработки
# создадим 2 очереди
men = Queue()
women = Queue()
# разберём данные по очередям
while data != []:
temp = data.pop(0)
if temp[1] == "м":
men.enqueue(temp[0])
else:
women.enqueue(temp[0])
# составим список танцоров
dance = []
while men.size() > 0 and women.size() > 0:
dance.append((men.dequeue(), women.dequeue()))
# вывод
dance = [" + ".join(i) for i in dance]
print("Пары танцоров:\n ", "\n ".join(dance), "\n")