Queue atau dalam bahasa Indonesia yang berarti antrean adalah struktur data yang menyusun elemen-elemen data dalam urutan linier. Memiliki prinsip dasar berupa FIFO (First In First Out) yang berarti elemen data yang pertama dimasukkan ke dalam antrean akan menjadi yang pertama pula untuk dikeluarkan.

A. Implementasi Queue dengan List

Dengan menggunakan metode list Python untuk menyimpan elemen Queue. Elemen baru akan ditambahkan ke bagian belakang dengan append(). Elemen akan dihapus dari bagian depan menggunakan pop().

Operasi pencarian dan penghapusan elemen di tengah antrian yang kurang efisien karena membutuhkan waktu yang lebih lama untuk mengakses elemen tersebut dibandingkan dengan array. Berikut adalah contoh kode programnya.

class QueueList:
  def __init__(self):
    self.queue = []

  def enqueue(self, item):
    self.queue.append(item)

  def dequeue(self):
    if not self.is_empty():
      return self.queue.pop(0)
    return None

  def front (self):
    return self.queue[0]
    if not self.is_empty():
      return self.queue[0]
    return None

  def rear (self):
    return self.queue[-1]
    if not self.is_empty():
      return self.queue[-1]
    return None

  def is_empty(self):
    return len(self.queue) == 0

  def size(self):
    return len(self.queue)

queue = QueueList()
queue.enqueue(10)
queue.enqueue(20)
queue.enqueue(30)
print("Queue setelah enqueue: ", queue.queue)
print("Front queue: ", queue.front())
print("Rear queue: ", queue.rear())
print("Size queue: ", queue.size())
print("Dequeue: ", queue.dequeue())
  • Enqueue() digunakan untuk menambahkan elemen menggunakan append().
  • Dequeue() digunakan untuk menghapus elemen menggunakan pop().
  • Front() digunakan untuk melihat elemen pertama dalam antrean.
  • Rear() digunakan untuk melihat elemen terakhir dalam antrean.
  • is_empty() mengecek apakah queue kosong
  • size() menghitung jumlah dan ukuran elemen dalam antrean.

B. Implementasi Queue dengan collections.deque

Collections.deque dalam Python adalah struktur data yang berfungsi sebagai double-ended queue (deque), memungkinkan penambahan dan penghapusan elemen dari kedua ujungnya dengan efisien, lebih baik daripada list untuk operasi antrian (FIFO) dan tumpukan (LIFO).

Operasi popleft() dalam deque memiliki kompleksitas O(1), sehingga tidak memerlukan pergeseran elemen seperti pada list. Berikut adalah contoh kode programnya.

from collections import deque

class QueueDeque:
  def __init__(self):
    self.queue = deque()

  def enqueue(self, item):
    self.queue.append(item)

  def dequeue(self):
    return self.queue.popleft()
    if not self.is_empty():
      return self.queue.popleft()
    return None

  def front (self):
    return self.queue[0]
    if not self.is_empty():
      return self.queue[0]
    return None

  def rear (self):
    return self.queue[-1]
    if not self.is_empty():
      return self.queue[-1]
    return None

  def is_empty(self):
    return len(self.queue) == 0

  def size(self):
    return len(self.queue)

queue = QueueDeque()
queue.enqueue(10)
queue.enqueue(20)
queue.enqueue(30)
print("Queue setelah enqueue: ", list(queue.queue))
print("Front queue: ", queue.front())
print("Rear queue: ", queue.rear())
print("Size queue: ", queue.size())
print("Dequeue: ", queue.dequeue())
  • from collections import deque digunakan untuk mengimpor deque dari modul collections.
  • popleft() digunakan untuk menghapus elemen dari depan dengan kompleksitas O(1).

C. Implementasi Queue dengan queue.Queue

Metode Queue dengan queue.Queue berasal dari modul queue di Python. Modul ini digunakan untuk manajemen antrian yang aman untuk multi-threading. Seperti inilah contoh implementasinya.

from queue import Queue

queue = Queue()
queue.put(10)
queue.put(20)
queue.put(30)
print("Queue size : ", queue.qsize())
print("Dequeue : ", queue.get())
print("Queue size setelah dequeue : ", queue.qsize())
  • from queue import Queue digunakan untuk mengimpor kelas Queue dari modul queue.
  • queue = Queue() digunakan untuk membuat objek antrian kosong.
  • put() digunakan untuk menambahkan elemen ke dalam antrian.
  • queue.qsize() untuk mengembalikan jumlah elemen dalam antrian.
  • queue.get() untuk menghapus dan mengembalikan elemen terdepan dalam antrian.

D. Implementasi Queue dengan Linked List

Queue dengan Linked List adalah implementasi antrian yang menggunakan node yang saling terhubung, bukan array atau deque.

Linked List lebih efisien dibandingkan array jika terjadi banyak operasi enqueue dan dequeue karena tidak perlu menggeser elemen. Memungkinkan penyimpanan secara dinamis tanpa batasan ukuran tetap. Berikut adalah contoh kode programnya.

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None

class QueueLinkedList:
  def __init__(self):
    self.front = self.rear = None

  def enqueue(self, data):
    new_node = Node(data)
    if self.rear is None:
      self.front = self.rear = new_node
      return
    self.rear.next = new_node
    self.rear = new_node

  def dequeue(self):
    if self.front is None:
      return None
    dequeued_element = self.front.data
    self.front = self.front.next
    if self.front is None:
      self.rear = None
    return dequeued_element

  def is_empty(self):
    return self.front is None

  def front_element(self):
    return self.front.data if self.front else None

  def rear_element(self):
    return self.rear.data if self.rear else None

queue = QueueLinkedList()
queue.enqueue(10)
queue.enqueue(20)
queue.enqueue(30)
print("Dequeued Element: ", queue.dequeue())
print("Front Element: ", queue.front_element())
print("Rear Element: ", queue.rear_element())

Metode utama pada kode ini adalah enqueue() untuk mengambahkan elemen, dequeue() untuk menghapus elemen. Adapun front_element() dan rear_element() untuk melihat elemen pertama dan terakhir pada antrian.

Latihan dan Tugas

None
class QueueList:
    def __init__(self, capacity=10):
        self.queue = []
        self.capacity = capacity

    def enqueue(self, ticket_id):
        if len(self.queue) >= self.capacity:
            print(f"Antrian penuh! Pelanggan {ticket_id} harus menunggu.")
            return
        if '7' in ticket_id:
            print(f"VIP Customer {ticket_id} langsung mendapatkan kursi.")
            return
        self.queue.append(ticket_id)
        print(f"Pelanggan {ticket_id} masuk ke antrian.")

    def dequeue(self):
        if not self.is_empty():
            return self.queue.pop(0)
        print("Antrian kosong!")
        return None

    def front(self):
        if not self.is_empty():
            return self.queue[0]
        return None

    def rear(self):
        if not self.is_empty():
            return self.queue[-1]
        return None

    def is_empty(self):
        return len(self.queue) == 0

    def size(self):
        return len(self.queue)

    def display(self):
        print("Antrian saat ini:", self.queue)


# Contoh penggunaan
queue = QueueList()
queue.enqueue("DZ16")
queue.enqueue("DZ17") # VIP
queue.enqueue("DZ18")
queue.enqueue("DZ19")
queue.enqueue("DZ20")

queue.display()

print("Front queue:", queue.front())
print("Rear queue:", queue.rear())
print("Size queue:", queue.size())
print("Dequeue:", queue.dequeue())

queue.display()

Kode di atas adalah program sederhana untuk antrian pemesanan tiket bioskop, berikut penjelasannya.

  • __init__(self, capacity=10) untuk menginialisasi queue berbasis list dengan kapasitas maksimal 10.
  • enqueue(self, ticket_id) untuk menambahkan elemen ke dalam antrian, dan mengecek nomor tiket yang berisi angka 7 adalah VIP.
  • dequeue(self) untuk menghapus dan mengembalikan elemen pertama dari antrian.
  • front(self) untuk mengembalikan elemen pertama tanpa menghapusnya, dan berisi None apabila antrian kosong.
  • rear(self) untuk mengembalikan elemen terakhir tanpa menghapusnya, dan berisi None apabila antrian kosong.
  • is_empty(self) untuk mengecek apakah antrian kosong.
  • size(self) untuk menghitung ukuran antrian atau elemen di dalam antrian.
  • display(self) untuk menampilkan isi antrian dalam bentuk list.
None
class QueueFotokopi:
    def __init__(self):
        self.queue = []

    def enqueue(self, order_id, num_pages):
        if num_pages < 10:
            print(f"Pesanan {order_id} dengan {num_pages} halaman langsung diproses (Fast Track).")
            return
        if num_pages > 100:
            self.queue.append((order_id, 100))
            self.queue.append((order_id, num_pages - 100))
            print(f"Pesanan {order_id} dengan {num_pages} halaman dipecah menjadi dua tahap.")
        else:
            self.queue.append((order_id, num_pages))
            print(f"Pesanan {order_id} dengan {num_pages} halaman masuk ke antrian.")

    def dequeue(self):
        if not self.is_empty():
            return self.queue.pop(0)
        print("Antrian kosong!")
        return None

    def front(self):
        return self.queue[0] if not self.is_empty() else None

    def rear(self):
        return self.queue[-1] if not self.is_empty() else None

    def is_empty(self):
        return len(self.queue) == 0

    def size(self):
        return len(self.queue)

    def display(self):
        print("Antrian fotokopi saat ini:", self.queue)


# Contoh penggunaan
queue = QueueFotokopi()

queue.enqueue("DZA16", 5)    # Fast Track
queue.enqueue("DZA17", 50)   # Antri biasa
queue.enqueue("DZA18", 150)  # Dipecah menjadi dua tahap
queue.enqueue("DZA19", 8)    # Fast Track

queue.display()

print("Front queue:", queue.front())
print("Rear queue:", queue.rear())
print("Size queue:", queue.size())
print("Dequeue:", queue.dequeue())

queue.display()

Kode di atas adalah program sederhana untuk antrian layanan fotokopi kampus, berikut penjelasannya.

  • enqueue(self, order_id, num_pages) untuk menginialisasi jika halaman kurang dari 10, maka akan langsung diproses (fast track). Jika lebih dari 100 halaman, akan dipecah menjadi 2 tahap dengan 100 halaman pertama dan sisanya pesanan baru. Jika halaman diantara 10 sampai 100, akan langsung masuk ke dalam antrian.
  • Fungsi sisanya berfungsi seperti pada program sebelumnya.
None
class QueueParkir:
    def __init__(self, kapasitas=15):
        self.queue = []
        self.kapasitas = kapasitas
        self.prioritas = []

    def enqueue(self, vehicle_number, is_eco_friendly=False):
        if is_eco_friendly:
            self.prioritas.append(vehicle_number)
            print(f"Kendaraan {vehicle_number} mendapat prioritas masuk parkiran lebih dulu.")
        else:
            if self.size() < self.kapasitas:
                self.queue.append(vehicle_number)
                print(f"Kendaraan {vehicle_number} masuk ke antrian parkir.")
            else:
                print(f"Parkiran penuh! Kendaraan {vehicle_number} harus menunggu.")

    def dequeue(self):
        if self.prioritas:
            return self.prioritas.pop(0)
        if not self.is_empty():
            return self.queue.pop(0)
        print("Tidak ada kendaraan dalam parkiran!")
        return None

    def front(self):
        return self.prioritas[0] if self.prioritas else (self.queue[0] if not self.is_empty() else None)

    def rear(self):
        return self.queue[-1] if self.queue else (self.prioritas[-1] if self.prioritas else None)

    def is_empty(self):
        return len(self.queue) == 0 and len(self.prioritas) == 0

    def size(self):
        return len(self.queue) + len(self.prioritas)

    def display(self):
        print(f"Antrian prioritas: {self.prioritas}")
        print(f"Antrian parkiran: {self.queue}")


# Contoh penggunaan
parkiran = QueueParkir()

parkiran.enqueue("MA16")
parkiran.enqueue("MA17", True)
parkiran.enqueue("MA18")
parkiran.enqueue("MA19", True)

parkiran.display()

print("Front queue:", parkiran.front())
print("Rear queue:", parkiran.rear())
print("Size queue:", parkiran.size())
print("Dequeue:", parkiran.dequeue())

parkiran.display()

Kode di atas adalah program sederhana dari antrian layanan parkir mall, berikut adalah penjelasannya.

  • __init__(self, kapasitas=15) untuk menginialisasi kapasitas maksimal adalah 15, sesuai dengan perintah yang diminta.
  • enqueue(self, vehicle_number, is_eco_friendly=False) untuk memisahkan antara kendaraan kendaraan ramah lingkungan dan kendaraan biasa. Jika ada kendaraan ramah lingkungan, akan dimasukkan ke dalam prioritas. Jika kendaraan biasa dan parkiran belum penuh, akan dimasukkan ke dalam reguler. Jika penuh, kendaraan menunggu.
  • Fungsi sisanya berfungsi seperti pada program sebelumnya.
None
class QueueSertifikat:
    def __init__(self, kapasitas=20):
        self.queue = []
        self.kapasitas = kapasitas
        self.jalur_prestasi = []

    def enqueue(self, student_id, is_prestasi=False):
        if is_prestasi:
            self.jalur_prestasi.append(student_id)
            print(f"Mahasiswa {student_id} langsung mengambil sertifikat (Jalur Prestasi).")
        else:
            if self.size() < self.kapasitas:
                self.queue.append(student_id)
                print(f"Mahasiswa {student_id} masuk ke antrian reguler.")
            else:
                print(f"Antrian penuh! Mahasiswa {student_id} harus menunggu.")
    
    def dequeue(self):
        if self.jalur_prestasi:
            return self.jalur_prestasi.pop(0)
        if not self.is_empty():
            return self.queue.pop(0)
        print("Antrian kosong!")
        return None
    
    def front(self):
        return self.jalur_prestasi[0] if self.jalur_prestasi else (self.queue[0] if not self.is_empty() else None)
    
    def rear(self):
        return self.queue[-1] if self.queue else (self.jalur_prestasi[-1] if self.jalur_prestasi else None)
    
    def is_empty(self):
        return len(self.queue) == 0 and len(self.jalur_prestasi) == 0
    
    def size(self):
        return len(self.queue) + len(self.jalur_prestasi)
    
    def display(self):
        print(f"Jalur Prestasi: {self.jalur_prestasi}")
        print(f"Antrian Reguler: {self.queue}")

# Contoh penggunaan
antrian = QueueSertifikat()

antrian.enqueue("TE16")
antrian.enqueue("TE17", True)
antrian.enqueue("TE18")
antrian.enqueue("AE19", True)

antrian.display()

print("Mahasiswa pertama dalam antrian:", antrian.front())
print("Mahasiswa terakhir dalam antrian:", antrian.rear())
print("Jumlah mahasiswa dalam antrian:", antrian.size())

print("Dequeue mahasiswa:", antrian.dequeue())
antrian.display()

Kode di atas adalah program sederhana dari antrian pengambilan sertifikat di kampus, berikut adalah penjelasannya.

  • enqueue(student_id, is_prestasi=False) untuk menginialisasi antrian mahasiswa berprestasi. Jika mahasiswa bernilai True akan langsung masuk ke dalam antrian prestasi. Jika antrian reguler penuh (20 mahasiswa) maka akan masuk ke jalur reguler terpisah.
  • Fungsi sisanya berfungsi seperti pada program sebelumnya.