Что такое структура данных очереди в Python?



Эта статья предоставит вам подробные и всесторонние знания о структурах данных очереди в Python с большим количеством примеров.

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

как выйти из метода в java

Необходимость в структуре данных очереди

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





queue-data-structure

Здесь люди стоят друг за другом и обслуживаются по Первый пришел - первый ушел (FIFO) механизм. Такое расположение известно как Очередь.



Примеры очереди из повседневной жизни

Давайте рассмотрим несколько примеров, когда мы используем тип очереди в повседневной жизни:

  • Автоответчик Первым обслуживается человек, который первым звонит на ваш гаджет.
  • Машина для проверки багажа - Проверяет багаж, который первым был оставлен на конвейерной ленте.
  • Транспортные средства на платном мосту - Транспортные средства, прибывающие рано, уезжают первыми.
  • Колл-центр - телефонные системы будут использовать очереди, чтобы удерживать звонящих в порядке, пока представитель службы не освободится.

Все эти примеры следуют Первый пришел - последний ушел стратегия.

Создание структуры данных очереди

Помимо дополнительных операций, я могу сказать, что основные возможные операции с очередью:



один. В очереди или добавить элемент в конец очереди.

2. Исключить из очереди или удалите элемент из начала очереди

Теперь давайте начнем с создания класса Queue в Python:

class Queue: def __init __ (self, max_size): self .__ max_size = max_size self .__ elements = [None] * self .__ max_size self .__ rear = -1 self .__ front = 0
  • max_size - максимальное количество элементов, ожидаемых в очереди.
  • Элементы очереди хранятся в списке Python
  • Rear указывает позицию индекса последнего элемента в очереди.
  • Задняя часть изначально принимается равной -1, потому что очередь пуста.
  • Спереди указывается позиция первого элемента в очереди.
  • Первоначально передняя часть принимается равной 0, потому что она всегда будет указывать на первый элемент очереди.

Поставить в очередь

Теперь, когда вы пытаетесь поставить элементы в очередь, вы должны помнить следующие моменты:

  • Есть ли место в очереди или нет, т.е. если задняя часть равна max_size -1
  • Задняя часть будет указывать на последний элемент, вставленный в очередь.

Итак, каков будет алгоритм ??

# возвращает max_size очереди def get_max_size (self): return self .__ max_size # возвращает логическое значение вне зависимости от того, заполнена очередь или нет, True, если заполнена, и False в противном случае def is_full (self): return self .__ rear == self .__ max_size-1 # вставляет / помещает данные в очередь, если они не заполнены def enqueue (self, data): if (self.is_full ()): print ('Очередь заполнена. Невозможно поставить в очередь') else: self .__ rear + = 1 self. __elements [self .__ rear] = data # отображать все содержимое очереди def display (self): for i in range (0, self .__ rear + 1): print (self .__ elements [i]) # Вы можете использовать ниже __str __ () для печати элементов объекта DS во время отладки def __str __ (self): msg = [] index = self .__ front while (index<=self.__rear): msg.append((str)(self.__elements[index])) index+=1 msg=' '.join(msg) msg='Queue data(Front to Rear): '+msg return msg

Теперь, когда вы выполните следующее:

queue1 = Очередь (5)

# Поставить в очередь все необходимые элементы.

queue1.enqueue («А»)

queue1.enqueue («B»)

queue1.enqueue («C»)

queue1.enqueue («D»)

queue1.enqueue («E»)

queue1.display ()

queue1.enqueue («F»)

печать (очередь1)

Вывод:

К

B

C

D

ЯВЛЯЕТСЯ

Очередь заполнена. Невозможно поставить в очередь

Данные очереди (спереди назад): A B C D E

Исключить из очереди

Теперь, когда вы вставили / поставили элементы в очередь, вы хотите исключить / удалить их спереди, поэтому вам нужно позаботиться о следующем:

  • В очереди есть элементы, т.е. задний не должен быть равен -1.
  • Во-вторых, вы должны помнить, что поскольку элементы удаляются спереди, то после удаления фронт должен быть увеличен до точки следующего фронта.
  • Передняя часть не должна указывать на конец очереди, т.е. равняться max_size.

Итак, каков будет алгоритм ??

# функция для проверки, пуста ли очередь или нет def is_empty (self): if (self .__ rear == - 1 или self .__ front == self .__ max_size): return True else: return False #function для удаления элемента и возврата it def dequeue (self): if (self.is_empty ()): print ('очередь уже пуста') else: data = self .__ elements [self .__ front] self .__ front + = 1 return data # функция для отображения элементов из от передней до задней, если очередь не пуста def display (self): if (not self.is_empty ()): for i in range (self .__ front, self .__ rear + 1): print (self .__ elements [i]) else : print ('пустая очередь')

Теперь, когда вы выполняете следующее:

queue1 = Очередь (5)

# Поставить в очередь все необходимые элементы

queue1.enqueue («А»)

queue1.enqueue («B»)

queue1.enqueue («C»)

queue1.enqueue («D»)

queue1.enqueue («E»)

печать (очередь1)

# Удалить из очереди все необходимые элементы

print («Удалено из очереди:«, queue1.dequeue ())

print («Удалено из очереди:«, queue1.dequeue ())

print («Удалено из очереди:«, queue1.dequeue ())

print («Удалено из очереди:«, queue1.dequeue ())

print («Удалено из очереди:«, queue1.dequeue ())

print («Удалено из очереди:«, queue1.dequeue ())

# Показать все элементы в очереди.

queue1.display ()

Вывод:

Данные очереди (спереди назад): A B C D E

Удалено из очереди: A

Удалено из очереди: B

Исключено из очереди: C

Удалено из очереди: D

Удалено из очереди: E

очередь уже пуста

Исключено из очереди: нет

пустая очередь

Приложения очереди

На данный момент вы уже поняли основы очереди. Теперь, чтобы погрузиться глубже, мы рассмотрим некоторые из его приложений.

  • Пример 1:

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

Предположим, вы выполнили команды печати для 3 документов в порядке doc1, за которым следуют doc2 и doc3.
Очередь печати будет заполнена, как показано ниже:

doc-n, где doc - это документ, отправленный на печать, а n, количество страниц в документе. Например, doc2-10 означает, что doc2 должен быть напечатан, и у него 10 страниц. Вот код, имитирующий работу очереди печати. Просмотрите код и посмотрите, как в этой реализации используется очередь.

class Queue: def __init __ (self, max_size): self .__ max_size = max_size self .__ elements = [None] * self .__ max_size self .__ rear = -1 self .__ front = 0 def is_full (self): if (self .__ Rear = = self .__ max_size-1): return True return False def is_empty (self): if (self .__ front> self .__ rear): return True return False def enqueue (self, data): if (self.is_full ()): print ('Очередь заполнена !!!') else: self .__ rear + = 1 self .__ elements [self .__ rear] = data def dequeue (self): if (self.is_empty ()): print ('Очередь пуста! !! ') else: data = self .__ elements [self .__ front] self .__ front + = 1 return data def display (self): for index in range (self .__ front, self .__ rear + 1): print (self .__ elements [index]) def get_max_size (self): return self .__ max_size # Вы можете использовать приведенную ниже __str __ () для печати элементов объекта DS при # отладке def __str __ (self): msg = [] index = self .__ front while (показатель<=self.__rear): msg.append((str)(self.__elements[index])) index+=1 msg=' '.join(msg) msg='Queue data(Front to Rear): '+msg return msg #function that enqueue are the documents to be printed in Queue named print_queue def send_for_print(doc): global print_queue if(print_queue.is_full()): print('Queue is full') else: print_queue.enqueue(doc) print(doc,'sent for printing') #function that prints the document if number of pages of document is less than #total number of pages in printer def start_printing(): global print_queue while(not print_queue.is_empty()): #here we dequeue the Queue and take the coument that was input first for printing. doc=print_queue.dequeue() global pages_in_printer #the aim of this for loop is to find number of pages of the of document which is doc name followed by “-“ for i in range(0,len(doc)): if(doc[i]=='-'): no_of_pages=int(doc[i+1:]) break if(no_of_pages<=pages_in_printer): print(doc,'printed') pages_in_printer-=no_of_pages print('Remaining no. of pages in printer:', pages_in_printer) else: print('Couldn't print',doc[:i],'. Not enough pages in the printer.') pages_in_printer=12 print_queue=Queue(10) send_for_print('doc1-5') send_for_print('doc2-3') send_for_print('doc3-6') start_printing()

Вывод:

doc1-5 отправлен в печать

doc2-3 отправлен в печать

doc3-6 отправлен в печать

doc1-5 напечатан

Остальные нет. страниц в принтере: 7

длина массива javascript

doc2-3 напечатан

Остальные нет. страниц в принтере: 4

Не удалось распечатать документ 3. В принтере недостаточно страниц

  • Пример 2:

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

  1. def fun (n):
  2. aqueue = Очередь (100)
  3. для числа в диапазоне (1, n + 1):
  4. enqueue (число)
  5. результат = 1
  6. а (not (aqueue.is_empty ())):
  7. num = AQUUE.DEQUEUE ()
  8. результат * = число
  9. печать (результат)

Когда функция fun () вызывается путем передачи n,

  • строки со 2 по 4 ставят в очередь элементы с 1 по n
  • строки с 5 по 8 находит продукт этих элементов, удаляя его из очереди один за другим

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

Есть вопрос к нам? Пожалуйста, укажите это в комментариях к этой статье, и мы свяжемся с вами как можно скорее.

Чтобы получить более глубокие знания о Python и его различных приложениях, вы можете зарегистрироваться в режиме реального времени. с круглосуточной поддержкой и пожизненным доступом.