java queue queue methods
Σε αυτό το σεμινάριο, θα συζητήσουμε Τι είναι μια ουρά στην Java, πώς να το χρησιμοποιήσετε, Παράδειγμα ουράς Java, Μέθοδοι ουράς Java και υλοποίηση διεπαφής ουράς:
Η ουρά είναι μια γραμμική δομή δεδομένων ή μια συλλογή στην Java που αποθηκεύει στοιχεία σε μια σειρά FIFO (First In, First Out).
Η συλλογή ουρών έχει δύο άκρα, δηλαδή εμπρός και πίσω. Τα στοιχεία προστίθενται στο πίσω μέρος και αφαιρούνται από το μέτωπο.
=> Επισκεφθείτε εδώ για να δείτε τη σειρά εκπαίδευσης Java για όλους.
Τι θα μάθετε:
Τι είναι η ουρά Java;
Μια δομή δεδομένων ουράς αναπαρίσταται όπως φαίνεται παρακάτω:
Όπως φαίνεται στο παραπάνω διάγραμμα, μια ουρά είναι μια δομή που έχει δύο σημεία, δηλαδή αρχή (εμπρός) και τέλος (πίσω). Στοιχεία εισάγονται στην ουρά στο πίσω μέρος και αφαιρούνται από την ουρά στο μπροστινό μέρος.
Στην Java, το Queue είναι μια διεπαφή που αποτελεί μέρος του πακέτου java.util. Η διεπαφή ουράς επεκτείνει τη διεπαφή συλλογής Java.
Ο γενικός ορισμός της διεπαφής ουράς είναι:
public interface Queue extends Collection
Δεδομένου ότι η ουρά είναι μια διεπαφή, δεν μπορεί να δημιουργηθεί. Χρειαζόμαστε συγκεκριμένες κατηγορίες για να εφαρμόσουμε τη λειτουργικότητα της διεπαφής ουράς. Δύο τάξεις εφαρμόζουν τη διεπαφή Queue, δηλαδή LinkedList και PriorityQueue.
Ακολουθούν μερικά από τα κύρια χαρακτηριστικά της δομής δεδομένων ουράς:
- Η ουρά ακολουθεί τη σειρά FIFO (First In, First Out). Αυτό σημαίνει ότι το στοιχείο εισάγεται στην ουρά στο τέλος και αφαιρείται από την ουρά στην αρχή.
- Η διεπαφή ουράς Java παρέχει όλες τις μεθόδους της διεπαφής συλλογής όπως εισαγωγή, διαγραφή κ.λπ.
- LinkedList και PriorityQueue είναι οι κλάσεις που εφαρμόζουν τη διεπαφή ουράς. Το ArrayBlockingQueue είναι μια ακόμη κατηγορία που εφαρμόζει τη διεπαφή Queue.
- Οι ουρές που αποτελούν μέρος του πακέτου java.util μπορούν να ταξινομηθούν ως ουδέτερες ουρές, ενώ αυτές που υπάρχουν στο java.util.the ταυτόχρονο πακέτο είναι οριοθετημένες ουρές.
- Το Deque είναι μια ουρά που υποστηρίζει εισαγωγή και διαγραφή και από τα δύο άκρα.
- Το deque είναι ασφαλές για νήματα.
- Το BlockingQueues είναι ασφαλές για νήματα και χρησιμοποιούνται για την εφαρμογή προβλημάτων παραγωγού-καταναλωτή.
- Το BlockingQueues δεν επιτρέπει μηδενικά στοιχεία. Ένα NullPointerException ρίχνεται εάν επιχειρήσετε οποιαδήποτε λειτουργία που σχετίζεται με τιμές null.
Πώς να χρησιμοποιήσετε μια ουρά στην Java;
Για να χρησιμοποιήσετε μια ουρά στην Java, πρέπει πρώτα να εισαγάγετε τη διεπαφή ουράς ως εξής:
import java.util.queue;
Ή
import java.util.*;
Μόλις εισαχθεί, μπορούμε να δημιουργήσουμε μια ουρά όπως φαίνεται παρακάτω:
Queue str_queue = new LinkedList ();
Καθώς η ουρά είναι μια διεπαφή, χρησιμοποιούμε μια κλάση LinkedList που εφαρμόζει τη διεπαφή ουράς για να δημιουργήσει ένα αντικείμενο ουράς.
Ομοίως, μπορούμε να δημιουργήσουμε μια ουρά με άλλες συγκεκριμένες κατηγορίες.
Queue str_pqueue = new PriorityQueue (); Queue int_queue = new ArrayDeque ();
Τώρα που δημιουργήθηκε το αντικείμενο ουράς, μπορούμε να προετοιμάσουμε το αντικείμενο ουράς παρέχοντας τις τιμές σε αυτό μέσω της μεθόδου προσθήκης όπως φαίνεται παρακάτω.
str_queue.add(“one”); str_queue.add(“two”); str_queue.add(“three”);
Παράδειγμα ουράς Java
import java.util.*; public class Main { public static void main(String() args) { //declare a Queue Queue str_queue = new LinkedList(); //initialize the queue with values str_queue.add('one'); str_queue.add('two'); str_queue.add('three'); str_queue.add('four'); //print the Queue System.out.println('The Queue contents:' + str_queue); } }
Παραγωγή:
Περιεχόμενα της ουράς: (ένα, δύο, τρία, τέσσερα)
Το παραπάνω παράδειγμα δείχνει τη δήλωση και την προετοιμασία ενός αντικειμένου ουράς. Στη συνέχεια, εκτυπώνουμε απλώς τα περιεχόμενα της ουράς.
Μέθοδοι ουράς στην Java
Σε αυτήν την ενότητα, θα συζητήσουμε τις μεθόδους του API για την ουρά. Η διεπαφή ουράς υποστηρίζει διάφορες λειτουργίες όπως εισαγωγή, διαγραφή, peek, κ.λπ. Ορισμένες λειτουργίες δημιουργούν μια εξαίρεση, ενώ ορισμένες επιστρέφουν μια συγκεκριμένη τιμή όταν η μέθοδος πετυχαίνει ή αποτυγχάνει.
Σημειώστε ότι δεν υπάρχουν συγκεκριμένες αλλαγές στη συλλογή Queue στην Java 8. Οι παρακάτω μέθοδοι είναι επίσης διαθέσιμες σε νεότερες εκδόσεις της Java, όπως η Java 9 κ.λπ.
Ο παρακάτω πίνακας συνοψίζει όλες αυτές τις μεθόδους.
Μέθοδος | Πρωτότυπο μεθόδου | Περιγραφή |
---|---|---|
Μέγεθος | int μέγεθος () | Επιστρέφει το μέγεθος ή τον αριθμό των στοιχείων στην ουρά. |
Προσθήκη | boolean add (E ε) | Προσθέτει το στοιχείο e στην ουρά στο τέλος (ουρά) της ουράς χωρίς να παραβιάζει τους περιορισμούς στην χωρητικότητα. Επιστρέφει αληθές εάν η επιτυχία ή το IllegalStateException εάν εξαντληθεί η χωρητικότητα. |
κρυφοκοίταγμα | E peek () | Επιστρέφει το κεφάλι (μπροστά) της ουράς χωρίς να το αφαιρέσετε. |
στοιχείο | E στοιχείο () | Εκτελεί την ίδια λειτουργία με τη μέθοδο peek (). Ρίχνει το NoSuchElementException όταν η ουρά είναι κενή. |
αφαιρώ | E αφαίρεση () | Αφαιρεί την κεφαλή της ουράς και την επιστρέφει. Ρίχνει το NoSuchElementException εάν η ουρά είναι κενή. |
ψηφοφορία | E δημοσκόπηση () | Αφαιρεί την κεφαλή της ουράς και την επιστρέφει. Εάν η ουρά είναι κενή, επιστρέφει null. |
Προσφορά | boolean προσφορά (E ε) | Εισαγάγετε το νέο στοιχείο e στην ουρά χωρίς να παραβιάσετε τους περιορισμούς χωρητικότητας. |
Επανάληψη στοιχείων ουράς
Μπορούμε να διασχίσουμε τα στοιχεία ουράς είτε χρησιμοποιώντας το βρόχο forEach είτε χρησιμοποιώντας επαναληπτικό. Το πρόγραμμα που δίνεται παρακάτω εφαρμόζει και τις δύο προσεγγίσεις για να διασχίσει την ουρά.
import java.util.*; public class Main { public static void main(String() args) { //declare a Queue Queue LL_queue = new LinkedList(); //initialize the Queue LL_queue.add('Value-0'); LL_queue.add('Value-1'); LL_queue.add('Value-2'); LL_queue.add('Value-3'); //traverse the Queue using Iterator System.out.println('The Queue elements through iterator:'); Iterator iterator = LL_queue.iterator(); while(iterator.hasNext()){ String element = (String) iterator.next(); System.out.print(element + ' '); } System.out.println('
The Queue elements using for loop:'); //use new for loop to traverse the Queue for(Object object : LL_queue) { String element = (String) object; System.out.print(element + ' '); } } }
Παραγωγή:
τα πιο δημοφιλή εργαλεία ανάλυσης μεγάλων δεδομένων
Τα στοιχεία ουράς μέσω επαναληπτικού:
Αξία-0 Αξία-1 Αξία-2 Αξία-3
Τα στοιχεία ουράς που χρησιμοποιούν για βρόχο:
Αξία-0 Αξία-1 Αξία-2 Αξία-3
Εφαρμογή ουράς Java
Το παρακάτω πρόγραμμα δείχνει τις μεθόδους που συζητήσαμε παραπάνω.
import java.util.*; public class Main { public static void main(String() args) { Queue q1 = new LinkedList(); //Add elements to the Queue q1.add(10); q1.add(20); q1.add(30); q1.add(40); q1.add(50); System.out.println('Elements in Queue:'+q1); //remove () method =>removes first element from the queue System.out.println('Element removed from the queue: '+q1.remove()); //element() => returns head of the queue System.out.println('Head of the queue: '+q1.element()); //poll () => removes and returns the head System.out.println('Poll():Returned Head of the queue: '+q1.poll()); //returns head of the queue System.out.println('peek():Head of the queue: '+q1.peek()); //print the contents of the Queue System.out.println('Final Queue:'+q1); } }
Παραγωγή:
Στοιχεία στην ουρά: (10, 20, 30, 40, 50)
Το στοιχείο καταργήθηκε από την ουρά: 10
Επικεφαλής της ουράς: 20
Δημοσκόπηση (): Επιστρεφόμενος επικεφαλής της ουράς: 20
peek (): Επικεφαλής της ουράς: 30
Τελική ουρά: (30, 40, 50)
Εφαρμογή Java Queue Array
Η εφαρμογή ουράς δεν είναι τόσο απλή όσο η εφαρμογή στοίβας. Πρώτα απ 'όλα, η ουρά περιέχει δύο δείκτες, πίσω και μπροστά. Επίσης, διαφορετικές λειτουργίες γίνονται σε δύο διαφορετικά άκρα.
Για να εφαρμόσετε την ουρά χρησιμοποιώντας Arrays, δηλώνουμε πρώτα έναν πίνακα που θα περιέχει n αριθμό στοιχείων ουράς.
Στη συνέχεια, ορίζουμε τις ακόλουθες λειτουργίες που θα εκτελεστούν σε αυτήν την ουρά.
# 1) Enqueue: Μια λειτουργία για την εισαγωγή ενός στοιχείου στην ουρά είναι Enqueue (function queueEnqueue στο πρόγραμμα). Για την εισαγωγή ενός στοιχείου στο πίσω άκρο, πρέπει πρώτα να ελέγξουμε εάν η ουρά είναι γεμάτη. Εάν είναι γεμάτο, τότε δεν μπορούμε να εισάγουμε το στοιχείο. Αν είναι πίσω # 2) Dequeue: Η λειτουργία διαγραφής ενός στοιχείου από την ουρά είναι το Dequeue (function queueDequeue στο πρόγραμμα). Αρχικά, ελέγχουμε εάν η ουρά είναι κενή. Για να λειτουργήσει η λειτουργία dequeue, πρέπει να υπάρχει τουλάχιστον ένα στοιχείο στην ουρά. # 3) Μπροστά: Αυτή η μέθοδος επιστρέφει το μπροστινό μέρος της ουράς. # 4) Οθόνη: Αυτή η μέθοδος διασχίζει την ουρά και εμφανίζει τα στοιχεία της ουράς. Το ακόλουθο πρόγραμμα Java δείχνει την υλοποίηση της σειράς Array. Παραγωγή: Αρχική ουρά: Καθώς έχουμε εφαρμόσει τη δομή δεδομένων ουράς χρησιμοποιώντας Arrays στο παραπάνω πρόγραμμα, μπορούμε επίσης να εφαρμόσουμε την ουρά χρησιμοποιώντας Linked List. Θα εφαρμόσουμε τις ίδιες μεθόδους enqueue, dequeue, front και display σε αυτό το πρόγραμμα. Η διαφορά είναι ότι θα χρησιμοποιήσουμε τη δομή δεδομένων της συνδεδεμένης λίστας αντί του Array. Το παρακάτω πρόγραμμα δείχνει την υλοποίηση της συνδεδεμένης λίστας του Queue στην Java. Παραγωγή: Το στοιχείο 6 προστέθηκε στην ουρά Το BlockingQueue είναι μια διεπαφή που προστίθεται στο Java 1.5 και είναι μέρος του java.util.concurrent πακέτο. Αυτή η διεπαφή εισάγει αποκλεισμό σε περίπτωση που το BlockingQueue είναι πλήρες ή κενό. Έτσι, όταν ένα νήμα αποκτά πρόσβαση στην ουρά και προσπαθεί να εισαγάγει (enqueue) στοιχεία σε μια ουρά που είναι ήδη γεμάτη έως ότου ένα άλλο νήμα δημιουργήσει ένα κενό στην ουρά (ίσως με λειτουργία dequeue ή εκκαθάριση ουράς). Παρομοίως, στην περίπτωση του dequeue, η λειτουργία αποκλείεται εάν η ουρά είναι κενή έως ότου το στοιχείο γίνει διαθέσιμο για τη λειτουργία dequeue. Οι μέθοδοι BlockingQueue χρησιμοποιούν κάποια μορφή ελέγχου ταυτότητας όπως εσωτερικές κλειδαριές και είναι ατομικές. Το BlockingQueue είναι μια παράλληλη ουρά που διαχειρίζεται τις λειτουργίες ουράς ταυτόχρονα. Το BlockingQueue φαίνεται παρακάτω: Σημειώστε ότι το BlockingQueue δεν δέχεται μηδενικές τιμές. Μια προσπάθεια εισαγωγής μηδενικής τιμής στην ουρά οδηγεί στο NullPointerException. Ορισμένες από τις εφαρμογές BlockingQueue που παρέχονται στην Java είναι LinkedBlockingQueue, PriorityBlockingQueue, ArrayBlockingQueue και SynchonousQueue. Όλες αυτές οι υλοποιήσεις είναι ασφαλείς στο νήμα. Το BlockingQueues είναι δύο τύπων: Στην οριοθετημένη ουρά, η χωρητικότητα της ουράς μεταφέρεται στον κατασκευαστή της ουράς. Η δήλωση ουράς έχει ως εξής: BlockingQueue blockingQueue = νέο LinkedBlockingDeque (5); Στην απεριόριστη ουρά, δεν ορίζουμε τη χωρητικότητα της ουράς ρητά και μπορεί να αυξηθεί σε μέγεθος. Η χωρητικότητα έχει οριστεί σε Integer.MAX_VALUE. Η δήλωση της μη περιορισμένης ουράς έχει ως εξής: BlockingQueue blockingQueue = νέο LinkedBlockingDeque (); Η διασύνδεση BlockingQueue χρησιμοποιείται κυρίως για τύπους προβλημάτων παραγωγού-καταναλωτή όπου ο παραγωγός παράγει τους πόρους και ο καταναλωτής καταναλώνει τους πόρους. Q # 1) Τι είναι η ουρά στην Java; Απάντηση: Η ουρά στην Java είναι μια γραμμική δομή δεδομένων που ακολουθεί τη σειρά των στοιχείων FIFO (First In, First Out). Αυτό σημαίνει ότι το στοιχείο που εισάγεται πρώτα στην ουρά θα είναι το πρώτο στοιχείο που θα αφαιρεθεί. Στην Java, η ουρά υλοποιείται ως διεπαφή που κληρονομεί τη διεπαφή συλλογής. Ε # 2) Είναι ένα Java που είναι ασφαλές για νήμα; Απάντηση: Δεν είναι όλες οι ουρές ασφαλείς για νήματα, αλλά το BlockingQueues στην Java δεν είναι ασφαλές για νήματα. Q # 3) Ποιο είναι πιο γρήγορο - Στοίβα ή ουρά; Απάντηση: Η στοίβα είναι ταχύτερη. Στη στοίβα, τα στοιχεία επεξεργάζονται μόνο από το ένα άκρο, επομένως δεν απαιτείται αλλαγή. Αλλά στην ουρά, τα στοιχεία πρέπει να μετατοπιστούν και να προσαρμοστούν, καθώς υπάρχουν δύο διαφορετικοί δείκτες για εισαγωγή και διαγραφή στοιχείων. Q # 4) Ποιοι είναι οι τύποι της ουράς; Απάντηση: Οι ουρές είναι των ακόλουθων τύπων: Q # 5) Γιατί χρησιμοποιείται η ουρά; Απάντηση: Η δομή δεδομένων ουράς χρησιμοποιείται για σκοπούς συγχρονισμού. Η ουρά χρησιμοποιείται επίσης για προγραμματισμό δίσκου και CPU. Σε αυτό το σεμινάριο, έχουμε συζητήσει τις απλές ουρές μαζί με τις λεπτομέρειες τους όπως δηλώσεις, εφαρμογή αρχικοποίησης και μεθόδους. Μάθαμε επίσης για την υλοποίηση της σειράς ουράς Array και LinkedList στην Java. Στα επερχόμενα σεμινάρια μας, θα συζητήσουμε λεπτομερώς περισσότερους τύπους ουρών. => Ελέγξτε ΟΛΑ τα Εκπαιδευτικά Java εδώ. class Queue { private static int front, rear, capacity; private static int queue(); Queue(int size) { front = rear = 0; capacity = size; queue = new int(capacity); } // insert an element into the queue static void queueEnqueue(int item) { // check if the queue is full if (capacity == rear) { System.out.printf('
Queue is full
'); return; } // insert element at the rear else { queue(rear) = item; rear++; } return; } //remove an element from the queue static void queueDequeue() { // check if queue is empty if (front == rear) { System.out.printf('
Queue is empty
'); return; } // shift elements to the right by one place uptil rear else { for (int i = 0; i
Η ουρά είναι άδεια
Ουρά μετά τη λειτουργία Enqueue:
10 = 30 = 50 = 70 =
Μπροστινό στοιχείο της ουράς: 10
Η ουρά είναι γεμάτη
10 = 30 = 50 = 70 =
Ουρά μετά από δύο λειτουργίες dequeue: 50 = 70 =
Μπροστινό στοιχείο της ουράς: 50Εφαρμογή λίστας συνδεδεμένων ουρών Java
class LinkedListQueue { private Node front, rear; private int queueSize; // queue size //linked list node private class Node { int data; Node next; } //default constructor - initially front & rear are null; size=0; queue is empty public LinkedListQueue() { front = null; rear = null; queueSize = 0; } //check if the queue is empty public boolean isEmpty() { return (queueSize == 0); } //Remove item from the front of the queue. public int dequeue() { int data = front.data; front = front.next; if (isEmpty()) { rear = null; } queueSize--; System.out.println('Element ' + data+ ' removed from the queue'); return data; } //Add data at the rear of the queue. public void enqueue(int data) { Node oldRear = rear; rear = new Node(); rear.data = data; rear.next = null; if (isEmpty()) { front = rear; } else { oldRear.next = rear; } queueSize++; System.out.println('Element ' + data+ ' added to the queue'); } //print front and rear of the queue public void print_frontRear() { System.out.println('Front of the queue:' + front.data + ' Rear of the queue:' + rear.data); } } class Main{ public static void main(String a()){ LinkedListQueue queue = new LinkedListQueue(); queue.enqueue(6); queue.enqueue(3); queue.print_frontRear(); queue.enqueue(12); queue.enqueue(24); queue.dequeue(); queue.dequeue(); queue.enqueue(9); queue.print_frontRear(); } }
Το στοιχείο 3 προστέθηκε στην ουρά
Μπροστά από την ουρά: 6 Πίσω από την ουρά: 3
Το στοιχείο 12 προστέθηκε στην ουρά
Το στοιχείο 24 προστέθηκε στην ουρά
Το στοιχείο 6 καταργήθηκε από την ουρά
Το στοιχείο 3 καταργήθηκε από την ουρά
Το στοιχείο 9 προστέθηκε στην ουρά
Μπροστά από την ουρά: 12 Πίσω από την ουρά: 9BlockingQueue Στην Java
Τύποι BlockingQueue
Οριοθετημένη ουρά
Χωρίς περιορισμούς ουρά
Συχνές Ερωτήσεις
πώς να χρησιμοποιήσετε ένα αρχείο swf
συμπέρασμα
Συνιστώμενη ανάγνωση