Apakah Struktur Data Antrian Di Python?



Artikel ini akan memberi anda pengetahuan terperinci dan komprehensif mengenai Struktur Data Antrian di Python dengan banyak contoh.

Seperti yang telah anda pelajari mengenai pentingnya Struktur Data dalam artikel sebelumnya, Mari kita selami topik artikel iaitu Struktur Data Antrian. Saya akan membincangkan topik berikut:

Memerlukan Struktur Data Antrian

Katakan anda mahukan filem satu hari nanti. Di multiplex, tiket dikeluarkan berdasarkan First-Come-First-Serve dan orang-orang berdiri di belakang satu sama lain menunggu giliran mereka. Jadi, apa yang anda akan buat ?? Anda mesti pergi ke belakang dan berdiri di belakang orang terakhir yang menunggu tiket.





queue-data-structure

Di sini, orang-orang berdiri satu di belakang yang lain dan mereka dilayan berdasarkan First-In-First-Out (FIFO) mekanisme. Susunan sedemikian dikenali sebagai Beratur.



Kehidupan Harian Contoh Beratur

Mari kita pertimbangkan beberapa contoh di mana kita melihat jenis giliran bekerja dalam kehidupan seharian:

  • Sistem menjawab telefon- Orang yang membuat panggilan pertama pada alat anda akan dihadiri terlebih dahulu.
  • Mesin pemeriksaan bagasi - Periksa Bagasi yang disimpan terlebih dahulu pada tali sawat.
  • Kenderaan di jambatan cukai tol - Kenderaan yang tiba lebih awal bertolak lebih awal.
  • Pusat panggilan - sistem telefon akan menggunakan Antrian, untuk menahan orang yang memanggilnya dalam keadaan teratur, sehingga wakil perkhidmatan bebas.

Semua contoh ini diikuti Pertama-Dalam-Terakhir-Keluar strategi.

Membuat Struktur Data Beratur

Selain daripada operasi pelengkap, saya mungkin mengatakan bahawa Operasi utama yang mungkin di Antrian adalah:



satu. En-beratur atau tambahkan elemen pada akhir giliran.

2. Nanti barisan atau keluarkan elemen dari hadapan barisan

Sekarang, mari kita mulakan dengan membuat Antrian kelas di Python:

cara membalikkan rentetan dalam python
giliran kelas: def __init __ (diri, max_size): diri .__ max_size = max_size self .__ elemen = [Tiada] * diri .__ max_size diri .__ belakang = -1 diri .__ depan = 0
  • saiz maksimum adalah bilangan elemen maksimum yang diharapkan dalam barisan.
  • Unsur-unsur barisan disimpan dalam senarai python
  • belakang menunjukkan kedudukan indeks elemen terakhir dalam barisan.
  • Bahagian belakang pada mulanya diambil menjadi -1 kerana barisan kosong
  • Depan menunjukkan kedudukan elemen pertama dalam barisan.
  • Bahagian depan dianggap 0 awalnya kerana akan selalu menunjukkan elemen pertama dalam barisan

Enkuue

Sekarang, semasa anda cuba memasukkan elemen ke Antrian, anda harus ingat perkara berikut:

  • Sama ada terdapat ruang yang tersisa dalam barisan atau tidak, jika belakang sama dengan max_size -1
  • Bahagian belakang akan menghala ke elemen terakhir yang dimasukkan ke dalam barisan.

Jadi, apa yang akan menjadi algoritma ??

#returns max_size of queue def get_max_size (self): return self .__ max_size #returns bool value sama ada queue is full or not, True if full and False sebaliknya def is_full (self): return self .__ belakang == self .__ max_size-1 # menyisipkan / memasukkan data ke dalam barisan jika tidak penuh def enqueue (diri, data): if (self.is_full ()): cetak ('Queue penuh. Tidak mungkin enqueue') yang lain: self .__ belakang + = 1 diri. __elemen [diri .__ belakang] = data #lihat semua kandungan paparan def antrian (diri): untuk i dalam jarak (0, diri .__ belakang + 1): cetak (elemen .__ diri [i]) #Anda boleh menggunakan di bawah __str __ () untuk mencetak unsur-unsur objek DS semasa melakukan debug def __str __ (diri): msg = [] index = self .__ depan sementara (index<=self.__rear): msg.append((str)(self.__elements[index])) index+=1 msg=' '.join(msg) msg='Queue data(Front to Rear): '+msg return msg

Sekarang, Apabila anda melaksanakan perkara berikut:

queue1 = Antrian (5)

#Ekapkan semua elemen yang diperlukan.

queue1.enqueue ('A')

queue1.enqueue ('B')

queue1.enqueue ('C')

queue1.enqueue ('D')

queue1.enqueue ('E')

queue1.display ()

queue1.enqueue ('F')

cetak (barisan1)

Pengeluaran:

KE

B

C

D

ADALAH

Antrian penuh. Tidak mungkin enqueue

Data barisan (Depan ke Belakang): A B C D E

De-Queue

Sekarang, semasa anda memasukkan / memasukkan elemen ke dalam barisan, anda ingin mengekstrak / menghapusnya dari depan, jadi anda perlu berhati-hati mengikuti:

  • Terdapat elemen dalam barisan iaitu belakang tidak boleh sama dengan -1.
  • Kedua, anda perlu ingat bahawa sebagai elemen dihapus dari depan jadi, setelah menghapus depan harus meningkat ke titik depan.
  • Bahagian depan tidak boleh menunjuk hujung giliran iaitu sama dengan ukuran maksimum.

Jadi, apa yang akan menjadi algoritma ??

#fungsi untuk memeriksa sama ada barisan kosong atau tidak def is_empty (self): if (self .__ belakang == - 1 atau self .__ front == self .__ max_size): return True other: return False #fungsi untuk menyahkod elemen dan kembali itu def dequeue (self): if (self.is_empty ()): print ('queue sudah kosong') yang lain: data = diri .__ elemen [diri .__ depan] diri .__ depan + = 1 data kembali #fungsi untuk memaparkan elemen dari depan ke belakang jika barisan tidak kosong paparan def (diri): jika (bukan self.is_empty ()): untuk i dalam jarak (self .__ depan, self .__ belakang + 1): cetak (elemen .__ diri [i]) lain : cetak ('barisan kosong')

Sekarang apabila anda melaksanakan perkara berikut:

queue1 = Antrian (5)

#Ekapkan semua elemen yang diperlukan

queue1.enqueue ('A')

queue1.enqueue ('B')

queue1.enqueue ('C')

queue1.enqueue ('D')

queue1.enqueue ('E')

cetak (barisan1)

#Dekodkan semua elemen yang diperlukan

cetak ('Dequeued:', queue1.dequeue ())

cetak ('Dequeued:', queue1.dequeue ())

cetak ('Dequeued:', queue1.dequeue ())

cetak ('Dequeued:', queue1.dequeue ())

final akhirnya muktamad di java

cetak ('Dequeued:', queue1.dequeue ())

cetak ('Dequeued:', queue1.dequeue ())

#Menampilkan semua elemen dalam barisan.

queue1.display ()

Pengeluaran:

Data barisan (Depan ke Belakang): A B C D E

Berhutang: A

Berhutang: B

Berhutang: C

Berhutang: D

Berhutang: E

barisan sudah kosong

Berhutang: Tiada

beratur kosong

Aplikasi Antrian

Setakat ini, anda sudah memahami asas-asas giliran. Sekarang untuk menyelami lebih dalam lagi kita akan melihat beberapa aplikasinya.

  • Contoh 1:

Print Queue di Windows menggunakan barisan untuk menyimpan semua pekerjaan cetak yang aktif dan belum selesai. Apabila kami ingin mencetak dokumen, kami mengeluarkan arahan cetak satu demi satu. Berdasarkan perintah cetak, dokumen akan berbaris dalam barisan cetak. Apabila pencetak sudah siap, dokumen akan dihantar terlebih dahulu dalam urutan pertama untuk mencetaknya.

Katakan anda telah mengeluarkan perintah cetak untuk 3 dokumen dalam urutan doc1, diikuti oleh doc2 dan doc3.
Antrian cetak akan diisi seperti gambar di bawah:

doc-n, di mana doc adalah dokumen yang dihantar untuk dicetak dan n, ialah bilangan halaman dalam dokumen. Contohnya, doc2-10 bermaksud doc2 harus dicetak dan mempunyai 10 halaman. Berikut adalah kod yang mensimulasikan operasi giliran cetak. Lihat kod dan perhatikan bagaimana barisan digunakan dalam pelaksanaan ini.

giliran kelas: def __init __ (self, max_size): self .__ max_size = max_size self .__ element = [None] * self .__ max_size self .__ belakang = -1 self .__ depan = 0 def is_full (self): if (self .__ belakang = = self .__ max_size-1): return True return False def is_empty (self): if (self .__ front> self .__ belakang): return True return False def enqueue (diri, data): if (self.is_full ()): cetak ('Queue is full !!!') other: self .__ belakang + = 1 self .__ elemen [self .__ belakang] = data def dequeue (self): if (self.is_empty ()): print ('Queue kosong! !! ') lain: data = diri .__ elemen [diri .__ depan] diri .__ depan + = 1 paparan data kembali data (diri): untuk indeks dalam jarak (diri .__ depan, diri .__ belakang + 1): cetak (elemen .__ diri) [index]) def get_max_size (self): return self .__ max_size #Anda boleh menggunakan __str __ () untuk mencetak elemen objek DS sambil #debugging def __str __ (self): msg = [] index = self .__ depan sementara (indeks<=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()

Pengeluaran:

doc1-5 dihantar untuk dicetak

doc2-3 dihantar untuk dicetak

doc3-6 dihantar untuk dicetak

doc1-5 dicetak

Baki no. halaman dalam pencetak: 7

doc2-3 dicetak

Baki no. halaman dalam pencetak: 4

Tidak dapat mencetak doc3. Halaman di pencetak tidak mencukupi

  • Contoh 2:

Mari cuba memahami contoh lain yang menggunakan struktur data Antrian. Bolehkah anda cuba memahami kod dan memberitahu apa fungsi berikut?

  1. keseronokan def (n):
  2. aqueue = Beratur (100)
  3. untuk bilangan dalam julat (1, n + 1):
  4. enqueue (bilangan)
  5. hasil = 1
  6. sementara (bukan (aqueue.is_empty ())):
  7. angka = AQUUE.DEQUEUE ()
  8. hasil * = bilangan
  9. cetak (hasil)

Apabila fungsi menyeronokkan () dipanggil dengan lulus n,

  • baris 2 hingga 4 en-queue elemen dari 1 hingga n
  • baris 5 hingga 8 menjumpai produk unsur-unsur tersebut dengan mengasingkannya satu persatu

Dengan ini, kita akan mengakhiri artikel Struktur Data Antrian ini. Sekiranya anda berjaya memahami dan menjalankan kod anda sendiri, anda bukan lagi pemula Struktur Data Antrian.

Ada soalan untuk kami? Sila sebutkan di bahagian komen artikel ini dan kami akan menghubungi anda secepat mungkin.

Untuk mendapatkan pengetahuan mendalam tentang Python bersama dengan pelbagai aplikasinya, anda boleh mendaftar secara langsung dengan sokongan 24/7 dan akses seumur hidup.