Структура та реалізація даних черги в Java, Python та C / C ++

У цьому підручнику ви дізнаєтесь, що таке черга. Крім того, ви знайдете реалізацію черги в C, C ++, Java та Python.

Черга - це корисна структура даних при програмуванні. Це схоже на чергу до квитків за межами кінозалу, де першою людиною, яка входить в чергу, є перша людина, яка отримує квиток.

Черга дотримується правила First In First Out (FIFO) - елемент, який входить першим, є елементом, який виходить першим.

Представлення черги FIFO

На наведеному вище зображенні, оскільки 1 було збережено в черзі до 2, воно також буде першим, яке також буде видалено з черги. Він дотримується правила FIFO .

З точки зору програмування, розміщення елементів у черзі називається enqueue , а видалення елементів з черги - dequeue .

Ми можемо реалізувати чергу будь-якою мовою програмування, такою як C, C ++, Java, Python або C #, але специфікація майже однакова.

Основні операції черги

Черга - це об’єкт (абстрактна структура даних - ADT), що дозволяє виконувати такі операції:

  • Очередь : Додайте елемент у кінець черги
  • Зняти чергу : Вилучити елемент з передньої частини черги
  • IsEmpty : Перевірте, чи не порожня черга
  • IsFull : Перевірте, чи черга повна
  • Peek : Отримайте значення передньої частини черги, не видаляючи її

Робота черги

Операції черги працюють наступним чином:

  • два покажчика ПЕРЕДНІЙ і ЗАДНИЙ
  • FRONT відстежує перший елемент черги
  • REAR відстежує останній елемент черги
  • спочатку встановіть значення FRONT і REAR на -1

Операція в черзі

  • перевірити, чи черга заповнена
  • для першого елемента встановіть значення FRONT на 0
  • збільшити індекс REAR на 1
  • додати новий елемент у позицію, на яку вказує REAR

Операція зняття черги

  • перевірити, чи не порожня черга
  • повертає значення, вказане FRONT
  • збільшити індекс FRONT на 1
  • для останнього елемента скиньте значення FRONT і REAR на -1
Операції з чергування та виведення з черги

Реалізації черги в Python, Java, C та C ++

Зазвичай ми використовуємо масиви для реалізації черг у Java та C / ++. У випадку з Python ми використовуємо списки.

Python Java C C ++
 # Queue implementation in Python class Queue: def __init__(self): self.queue = () # Add an element def enqueue(self, item): self.queue.append(item) # Remove an element def dequeue(self): if len(self.queue) < 1: return None return self.queue.pop(0) # Display the queue def display(self): print(self.queue) def size(self): return len(self.queue) q = Queue() q.enqueue(1) q.enqueue(2) q.enqueue(3) q.enqueue(4) q.enqueue(5) q.display() q.dequeue() print("After removing an element") q.display() 
 // Queue implementation in Java public class Queue ( int SIZE = 5; int items() = new int(SIZE); int front, rear; Queue() ( front = -1; rear = -1; ) boolean isFull() ( if (front == 0 && rear == SIZE - 1) ( return true; ) return false; ) boolean isEmpty() ( if (front == -1) return true; else return false; ) void enQueue(int element) ( if (isFull()) ( System.out.println("Queue is full"); ) else ( if (front == -1) front = 0; rear++; items(rear) = element; System.out.println("Inserted " + element); ) ) int deQueue() ( int element; if (isEmpty()) ( System.out.println("Queue is empty"); return (-1); ) else ( element = items(front); if (front>= rear) ( front = -1; rear = -1; ) /* Q has only one element, so we reset the queue after deleting it. */ else ( front++; ) System.out.println("Deleted -> " + element); return (element); ) ) void display() ( /* Function to display elements of Queue */ int i; if (isEmpty()) ( System.out.println("Empty Queue"); ) else ( System.out.println("Front index-> " + front); System.out.println("Items -> "); for (i = front; i " + rear); ) ) public static void main(String() args) ( Queue q = new Queue(); // deQueue is not possible on empty queue q.deQueue(); // enQueue 5 elements q.enQueue(1); q.enQueue(2); q.enQueue(3); q.enQueue(4); q.enQueue(5); // 6th element can't be added to because the queue is full q.enQueue(6); q.display(); // deQueue removes element entered first i.e. 1 q.deQueue(); // Now we have just 4 elements q.display(); ) )
 // Queue implementation in C #include #define SIZE 5 void enQueue(int); void deQueue(); void display(); int items(SIZE), front = -1, rear = -1; int main() ( //deQueue is not possible on empty queue deQueue(); //enQueue 5 elements enQueue(1); enQueue(2); enQueue(3); enQueue(4); enQueue(5); // 6th element can't be added to because the queue is full enQueue(6); display(); //deQueue removes element entered first i.e. 1 deQueue(); //Now we have just 4 elements display(); return 0; ) void enQueue(int value) ( if (rear == SIZE - 1) printf("Queue is Full!!"); else ( if (front == -1) front = 0; rear++; items(rear) = value; printf("Inserted -> %d", value); ) ) void deQueue() ( if (front == -1) printf("Queue is Empty!!"); else ( printf("Deleted : %d", items(front)); front++; if (front> rear) front = rear = -1; ) ) // Function to print the queue void display() ( if (rear == -1) printf("Queue is Empty!!!"); else ( int i; printf("Queue elements are:"); for (i = front; i <= rear; i++) printf("%d ", items(i)); ) printf(""); )
 // Queue implementation in C++ #include #define SIZE 5 using namespace std; class Queue ( private: int items(SIZE), front, rear; public: Queue() ( front = -1; rear = -1; ) bool isFull() ( if (front == 0 && rear == SIZE - 1) ( return true; ) return false; ) bool isEmpty() ( if (front == -1) return true; else return false; ) void enQueue(int element) ( if (isFull()) ( cout << "Queue is full"; ) else ( if (front == -1) front = 0; rear++; items(rear) = element; cout << endl << "Inserted " << element << endl; ) ) int deQueue() ( int element; if (isEmpty()) ( cout << "Queue is empty" <= rear) ( front = -1; rear = -1; ) /* Q has only one element, so we reset the queue after deleting it. */ else ( front++; ) cout << endl < " << element << endl; return (element); ) ) void display() ( /* Function to display elements of Queue */ int i; if (isEmpty()) ( cout << endl << "Empty Queue" << endl; ) else ( cout << endl < " << front; cout << endl < "; for (i = front; i <= rear; i++) cout << items(i) << " "; cout << endl < " << rear << endl; ) ) ); int main() ( Queue q; //deQueue is not possible on empty queue q.deQueue(); //enQueue 5 elements q.enQueue(1); q.enQueue(2); q.enQueue(3); q.enQueue(4); q.enQueue(5); // 6th element can't be added to because the queue is full q.enQueue(6); q.display(); //deQueue removes element entered first i.e. 1 q.deQueue(); //Now we have just 4 elements q.display(); return 0; )

Обмеження черги

Як ви можете бачити на зображенні нижче, після невеликого розміщення в черзі та зменшення черги розмір черги зменшився.

Обмеження черги

І ми можемо додавати індекси 0 та 1 лише тоді, коли чергу скидається (коли всі елементи скидаються з черги).

Після того, як REAR досягне останнього індексу, якщо ми зможемо зберігати зайві елементи у порожніх просторах (0 та 1), ми зможемо використовувати порожні пробіли. Це реалізовано модифікованою чергою, яка називається круговою.

Аналіз складності

Складність операцій з чергуванням та вилученням у черзі з використанням масиву становить O(1).

Програми черги

  • Планування процесора, дискове планування
  • Коли дані передаються асинхронно між двома процесами. Черга використовується для синхронізації. Наприклад: буфери вводу-виводу, трубопроводи, файл вводу-виводу тощо
  • Обробка переривань у системах реального часу.
  • Телефонні системи кол-центру використовують черги, щоб утримувати людей, які телефонують їм по порядку.

Рекомендовані читання

  • Типи черги
  • Кругова черга
  • Структура даних Deque
  • Черга пріоритетів

Цікаві статті...