queue data structure c with illustration
Krótkie wprowadzenie do kolejki w C ++ z ilustracjami.
Kolejka to podstawowa struktura danych, podobnie jak stos. W przeciwieństwie do stosu, który wykorzystuje podejście LIFO, kolejka używa podejścia FIFO (pierwsze weszło, pierwsze wyszło). W takim podejściu pierwszy element dodawany do kolejki jest pierwszym elementem usuwanym z kolejki. Podobnie jak Stack, kolejka jest również liniową strukturą danych.
oprogramowanie do pobierania filmów z witryn internetowych
W prawdziwej analogii możemy wyobrazić sobie kolejkę autobusową, w której pasażerowie czekają na autobus w kolejce lub w kolejce. Pierwszy pasażer w linii wsiada do autobusu jako pierwszy, ponieważ jest to ten, który przyjechał pierwszy.
=> Przeczytaj popularne serie szkoleń C ++ tutaj.
Czego się nauczysz:
Kolejka w C ++
Z punktu widzenia oprogramowania kolejkę można postrzegać jako zestaw lub zbiór elementów, jak pokazano poniżej. Elementy są ułożone liniowo.
Mamy dwa końce, czyli „przód” i „tył” kolejki. Gdy kolejka jest pusta, oba wskaźniki są ustawione na -1.
„Tylny” wskaźnik końca to miejsce, z którego elementy są wstawiane do kolejki. Operacja dodawania / wstawiania elementów do kolejki nosi nazwę „enqueue”.
Wskaźnik końca „frontowego” to miejsce, z którego elementy są usuwane z kolejki. Operacja usuwania / usuwania elementów z kolejki nosi nazwę „dequeue”.
Gdy wartość tylnego wskaźnika ma rozmiar-1, wówczas mówimy, że kolejka jest pełna. Gdy przód jest pusty, kolejka jest pusta.
Podstawowe operacje
Struktura danych kolejki obejmuje następujące operacje:
- EnQueue: Dodaje element do kolejki. Dodanie pozycji do kolejki zawsze odbywa się z tyłu kolejki.
- DeQueue: Usuwa element z kolejki. Element jest usuwany lub usuwany z kolejki zawsze z przodu kolejki.
- jest pusty: Sprawdza, czy kolejka jest pusta.
- jest pełna: Sprawdza, czy kolejka jest pełna.
- zerkać: Pobiera element z początku kolejki bez usuwania go.
Umieść w kolejce
W tym procesie wykonywane są następujące kroki:
- Sprawdź, czy kolejka jest pełna.
- Jeśli jest pełny, wygeneruj błąd przepełnienia i zakończ.
- W przeciwnym razie przyrost „tył”.
- Dodaj element w miejscu wskazanym przez „tył”.
- Powróć sukces.
Usuń z kolejki
Operacja usuwania z kolejki składa się z następujących kroków:
- Sprawdź, czy kolejka jest pusta.
- Jeśli jest pusty, wyświetl błąd niedomiaru i zakończ.
- W przeciwnym razie element dostępu jest oznaczony jako „przód”.
- Zwiększ „przód”, aby wskazywał następne dostępne dane.
- Powróć sukces.
Następnie zobaczymy szczegółową ilustrację operacji wstawiania i usuwania w kolejce.
Ilustracja
To jest pusta kolejka i dlatego mamy tylną i pustą ustawioną na -1.
Następnie dodajemy 1 do kolejki, w wyniku czego tylny wskaźnik przesuwa się do przodu o jedno miejsce.
Na następnym rysunku dodajemy element 2 do kolejki, przesuwając tylny wskaźnik do przodu o kolejny przyrost.
Na poniższym rysunku dodajemy element 3 i przesuwamy tylny wskaźnik o 1.
W tym momencie tylny wskaźnik ma wartość 2, a przedni wskaźnik jest na 0thLokalizacja.
Następnie usuwamy element wskazywany przez przedni wskaźnik. Ponieważ przedni wskaźnik ma wartość 0, usuwany element ma wartość 1.
W ten sposób pierwszy element wprowadzony do kolejki, czyli 1, jest pierwszym elementem usuwanym z kolejki. W rezultacie, po pierwszym usunięciu z kolejki, przedni wskaźnik zostanie teraz przesunięty do przodu o następną lokalizację, czyli 1.
Implementacja tablicy dla kolejki
Zaimplementujmy strukturę danych kolejki w C ++.
#include #define MAX_SIZE 5 using namespace std; class Queue { private: int myqueue(MAX_SIZE), front, rear; public: Queue(){ front = -1; rear = -1; } boolisFull(){ if(front == 0 && rear == MAX_SIZE - 1){ return true; } return false; } boolisEmpty(){ if(front == -1) return true; else return false; } void enQueue(int value){ if(isFull()){ cout << endl<< 'Queue is full!!'; } else { if(front == -1) front = 0; rear++; myqueue(rear) = value; cout << value << ' '; } } int deQueue(){ int value; if(isEmpty()){ cout << 'Queue is empty!!' <= rear){ //only one element in queue front = -1; rear = -1; } else { front++; } cout << endl < ' << value << ' from myqueue'; return(value); } } /* Function to display elements of Queue */ void displayQueue() { int i; if(isEmpty()) { cout << endl << 'Queue is Empty!!' << endl; } else { cout << endl << 'Front = ' << front; cout << endl << 'Queue elements : '; for(i=front; i<=rear; i++) cout << myqueue(i) << ' '; cout << endl << 'Rear = ' << rear << endl; } } }; int main() { Queue myq; myq.deQueue(); //deQueue cout<<'Queue created:'< queue is full myq.enQueue(60); myq.displayQueue(); //deQueue =>removes 10 myq.deQueue(); //queue after dequeue myq.displayQueue(); return 0; }
Wynik:
Kolejka jest pusta !!
Utworzono kolejkę:
10 20 30 40 50
Kolejka jest pełna !!
Przód = 0
Elementy kolejki: 10 20 30 40 50
Tył = 4
Usunięte => 10 z myqueue
Przód = 1
Elementy kolejki: 20 30 40 50
Tył = 4
Powyższa implementacja pokazuje kolejkę reprezentowaną jako tablica. Określamy max_size dla tablicy. Definiujemy również operacje enqueue i dequeue, a także operacje isFull i isEmpty.
Poniżej podano implementację struktury danych kolejki w języku Java.
// A class representing a queue class Queue { int front, rear, size; int max_size; int myqueue(); public Queue(int max_size) { this.max_size = max_size; front = this.size = 0; rear = max_size - 1; myqueue = new int(this.max_size); } //if size = max_size , queue is full boolean isFull(Queue queue) { return (queue.size == queue.max_size); } // size = 0, queue is empty boolean isEmpty(Queue queue) { return (queue.size == 0); } // enqueue - add an element to the queue void enqueue( int item) { if (isFull(this)) return; this.rear = (this.rear + 1)%this.max_size; this.myqueue(this.rear) = item; this.size = this.size + 1; System.out.print(item + ' ' ); } // dequeue - remove an elment from the queue int dequeue() { if (isEmpty(this)) return Integer.MIN_VALUE; int item = this.myqueue(this.front); this.front = (this.front + 1)%this.max_size; this.size = this.size - 1; return item; } // move to front of the queue int front() { if (isEmpty(this)) return Integer.MIN_VALUE; return this.myqueue(this.front); } // move to the rear of the queue int rear() { if (isEmpty(this)) return Integer.MIN_VALUE; return this.myqueue(this.rear); } } // main class class Main { public static void main(String() args) { Queue queue = new Queue(1000); System.out.println('Queue created as:'); queue.enqueue(10); queue.enqueue(20); queue.enqueue(30); queue.enqueue(40); System.out.println('
Element ' + queue.dequeue() + ' dequeued from queue
'); System.out.println('Front item is ' + queue.front()); System.out.println('Rear item is ' + queue.rear()); } }
Wynik:
Kolejka utworzona jako:
10 20 30 40
Element 10 usunięty z kolejki
Przednia pozycja to 20
Tylna pozycja to 40
Powyższa implementacja jest podobna do implementacji C ++.
Następnie zaimplementujmy kolejkę w C ++ przy użyciu połączonej listy.
Implementacja listy połączonej dla kolejki:
#include using namespace std; struct node { int data; struct node *next; }; struct node* front = NULL; struct node* rear = NULL; struct node* temp; void Insert(int val) { if (rear == NULL) { rear = new node; rear->next = NULL; rear->data = val; front = rear; } else { temp=new node; rear->next = temp; temp->data = val; temp->next = NULL; rear = temp; } } void Delete() { temp = front; if (front == NULL) { cout<<'Queue is empty!!'next; cout<<'Element deleted from queue is : ' Wynik:
Utworzono kolejkę:
10 20 30 40 50
Element usunięty z kolejki to: 10
Kolejka po jednym usunięciu:
20 30 40 50
jak znaleźć klucz bezpieczeństwa sieci na Androidzie
Stack Vs. Kolejka
Stosy i kolejki to drugorzędne struktury danych, których można używać do przechowywania danych. Można je zaprogramować przy użyciu podstawowych struktur danych, takich jak tablice i połączone listy. Po szczegółowym omówieniu obu struktur danych nadszedł czas, aby omówić główne różnice między tymi dwoma strukturami danych.
Półki na książki Kolejki Stosuje podejście LIFO (ostatnie weszło, pierwsze wyszło). Wykorzystuje podejście FIFO (pierwsze weszło, pierwsze wyszło). Przedmioty są dodawane lub usuwane tylko z jednego końca stosu zwanego „Górą”. Elementy są dodawane z „tylnego” końca kolejki i są usuwane z „przodu” kolejki. Podstawowe operacje na stosie to „push” i „Pop”. Podstawowe operacje dla kolejki to „enqueue” i „dequeue”. Możemy wykonywać wszystkie operacje na stosie, utrzymując tylko jeden wskaźnik dostępu do szczytu stosu. W kolejkach musimy utrzymywać dwa wskaźniki, jeden do dostępu do przedniej części kolejki, a drugi do dostępu do tyłu kolejki. Stos jest najczęściej używany do rozwiązywania problemów rekurencyjnych. Kolejki służą do rozwiązywania problemów związanych z zamówionym przetwarzaniem.
Aplikacje kolejki
Omówmy poniżej różne zastosowania struktury danych kolejki.
- Struktura danych kolejki jest używana w różnych harmonogramach procesora i dysków. Tutaj mamy wiele zadań wymagających procesora lub dysku w tym samym czasie. Czas procesora lub dysku jest planowany dla każdego zadania przy użyciu kolejki.
- Kolejka może być również używana do buforowania drukowania, w którym liczba zadań drukowania jest umieszczana w kolejce.
- Obsługa przerwań w systemach czasu rzeczywistego odbywa się za pomocą struktury danych kolejki. Przerwania są obsługiwane w kolejności, w jakiej przychodzą.
- Przeszukiwanie wszerz, w którym przechodzą sąsiednie węzły drzewa przed przejściem do następnego poziomu, wykorzystuje kolejkę do implementacji.
- Systemy telefoniczne call center wykorzystują kolejki do wstrzymywania połączeń do momentu odebrania ich przez przedstawicieli serwisu.
Ogólnie można powiedzieć, że struktura danych kolejki jest używana zawsze, gdy wymagamy, aby zasoby lub pozycje były obsługiwane w kolejności, w jakiej przybyły, tj. Pierwsze weszło, pierwsze wyszło.
Wniosek
Kolejka to struktura danych FIFO (First In, First Out), która jest najczęściej używana w zasobach, w których wymagane jest planowanie. Ma dwa wskaźniki z tyłu i z przodu na dwóch końcach, które służą do wstawiania elementu i usuwania elementu odpowiednio do / z kolejki.
W następnym samouczku dowiemy się o niektórych rozszerzeniach kolejki, takich jak kolejka priorytetowa i kolejka cykliczna.
=> Zobacz tutaj, aby poznać pełną listę samouczków języka C ++.
rekomendowane lektury
- Struktura danych kolejki priorytetowej w C ++ z ilustracją
- Kolejka priorytetowa w STL
- Struktura danych stosu w C ++ z ilustracjami
- Struktura danych listy połączonej cyklicznie w C ++ z ilustracją
- Struktura danych listy połączonej w C ++ z ilustracją
- Struktura danych listy podwójnie połączonych w C ++ z ilustracjami
- Wprowadzenie do struktur danych w C ++
- Parametryzacja danych JMeter za pomocą zmiennych zdefiniowanych przez użytkownika