Queue (Navbat) - bu elementlarni FIFO (First In First Out - birinchi kirgan birinchi chiqadi) usulida saqlaydigan to’plam. U elementlarni qo’shilgan tartibini saqlaydi va ularni ro’yxat boshidan o’chiradi.
Queue interfeysi java.util papkasida joylashgan va 2 ta class tomonidan implementatsiya qilinadi: LinkedList va PriorityQueue. Interfeysning asosiy metodlari quyidagilar:
- boolean add(object) - navbatga element qo’shadi va agar qo’shsa true qaytaradi.
- boolean offer(object) - navbatga element qo’shadi.
- Object remove() - navbat boshidan elementni o’chiradi va uni qaytaradi.
- Object poll() - navbat boshidan elementni o’chiradi va uni qaytaradi, agar navbat bo’sh bo’lsa null qaytaradi.
- Object element() - navbat boshidagi elementni qaytaradi, ammo uni o’chirmaydi.
- Object peek() - navbat boshidagi elementni qaytaradi, ammo uni o’chirmaydi, agar navbat bo’sh bo’lsa null qaytaradi.
Quyida navbatning asosiy xususiyatlarini keltirib o’tamiz:
- Yuqorida ta’kidlaganimizdek, navbat FIFO (First In First Out - birinchi kirgan birinchi chiqadi) usuli asosida elementlarni qo’shadi va o’chiradi.
- Queue Collections interfeysining barcha metodlarini qo’llab-quvvatlaydi, masalan qo’shish, o’chirish kabi.
- PriorityQueue, ArrayBlockingQueue va LinkedList classlari Queue interfeysining asosiy implementatsiyalari hisoblanadi.
- java.util papkasida joylashgan shunday navbatlar Unbounded Queues (chegarasiz navbatlar) deyiladi.
- java.util.concurrent papkasida joylashgan navbatlar Bounded Queues (chegaralangan navbatlar) deyiladi.
PriorityQueue - bu navbat elementlarini biror ustuvorlik jihatidan tartiblab saqlaydigan class hisoblanadi. Garchi navbat elementlari FIFO usulida saqlansa ham, ba’zan ularni biror kategoriya bo’yicha tartiblashga ehtiyoj seziladi, shunday paytda ushbu class yordamga keladi. Quyidagi misolga e’tibor bering:
import java.util.*;
class TestCollection12{
public static void main(String[] args){
PriorityQueue<Integer> queue=new PriorityQueue<>();
queue.add(76);
queue.add(35);
queue.add(44);
queue.add(21);
queue.add(87);
System.out.println("head (navbat boshi): "+queue.element());
System.out.println("head (navbat boshi): "+queue.peek());
System.out.println("Elementlarni iteratsiya qilamiz:");
for (Integer integer : queue) {
System.out.println(integer);
}
queue.remove();
queue.poll();
System.out.println("Ikkita element o'chirilgandan so'ng:");
for (Integer integer : queue) {
System.out.println(integer);
}
}
}
Stack - bu elementlarni LIFO (Last In First Out - oxirgi kirgan birinchi chiqadi) usulida saqlaydigan to’plam. Uning eng asosiy 2 amali push va pop hisoblanadi. Push stack tepasiga element qo’shadi va pop ese stack tepasidan elementni o’chiradi. Quyidagi rasmda ularni tushunishga harakat qiling:
Java dasturlash tilida Stack classi stacklar bilan ishlash uchun ishlatiladi. Uning ierarxiyasi quyidagicha:
Stack classining asosiy metodlari quyidagilar:
- empty() - stackni bo’shlikka tekshiradi
- push(E item) - stack tepasiga element qo’shadi
- pop() - stack tepasidagi elementni o’chiradi va uni qaytaradi
- peek() - stack tepasidagi elementni qaytaradi, lekin uni qaytarmaydi
- search(Object o) - stackdan elementni qidiradi va uning pozitsiyasini qaytaradi
Quyidagi misolga e’tibor bering:
import java.util.Stack;
public class StackMisol {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
System.out.println("Stack tepasidagi element: " + stack.pop());
System.out.println("Stack tepasidagi element: " + stack.peek());
if(stack.isEmpty()) System.out.println("Stack bo'sh");
else System.out.println("Stackda " + stack.size() + " ta element bor");
System.out.println("Stackda 1 sonining pozitsiyasi: " + stack.search(1));
}
}