58 / 90

C++ std::queue

C++ std::queue (Navbat)

C++ tilida STL queue navbatdagi maʼlumotlar strukturasining funksionalligini taʼminlaydi.

Navbatdagi ma'lumotlar strukturasi FIFO (birinchi kiruvchi birinchi chiqadi) tamoyiliga amal qiladi, bunda birinchi qo'shilgan elementlar birinchi bo'lib o'chiriladi.

Navbatdagi ma'lumotlar tuzilmasi

In a queue, elements are added from the rear and removed from the front.

Tavsiya etilgan o'qishlar

C++ STL navbatini yarating

C++ da navbat yaratish uchun avval queue sarlavha faylini kiritishimiz kerak.

example.cpp
#include <queue>

Ushbu faylni import qilgandan so'ng, biz quyidagi sintaksis yordamida queue yaratishimiz mumkin:

example.cpp
queue<type> q;

Bu erda type biz navbatda saqlamoqchi bo'lgan data type ni bildiradi. Masalan,

example.cpp
// butun sonli ma'lumotlar turidagi navbat yaratish
queue<int> integer_queue;

// string ma'lumotlar turi navbatini yaratish
queue<string> string_queue;

C++ navbat usullari

C++ tilida queue class bo'lib, navbatdagi turli operatsiyalarni bajarish uchun turli usullarni taqdim etadi.

Usullar tavsifi push() Elementni navbatning orqa tomoniga kiritadi. pop() Navbatning oldingi qismidan elementni olib tashlaydi. front() Navbatning birinchi elementini qaytaradi. back() Navbatning oxirgi elementini qaytaradi. size() Navbatdagi elementlar sonini qaytaradi. empty() Agar navbat bo'sh bo'lsa, true ni qaytaradi.

Elementni navbatning orqa tomoniga kiritish uchun push() usulidan foydalanamiz. Masalan,

example.cpp
#include <iostream>
#include <queue>

using namespace std;

int main() {

  // qatorlar qatorini yarating
  queue<string> animals;

  // elementlarni navbatga surish
  animals.push("Cat");
  animals.push("Dog");
  
  cout << "Queue: ";

  // navbat elementlarini chop etish
  // navbat bo'sh bo'lguncha aylanish
  while(!animals.empty()) {

    // elementni chop eting
    cout << animals.front() << ", ";

    // navbatdan ochilgan element
    animals.pop();
  }

  cout << endl;
 
  return 0;
}

Chiqish

kod
Queue: Cat, Dog,

Yuqoridagi misolda biz hayvonlar deb ataladigan queue strings ni yaratdik. Bu erda biz navbatning oxiriga elementlar qo'shish uchun push() usulidan foydalandik.

example.cpp
animals.push("Cat");
animals.push("Dog");

To'g'ridan-to'g'ri navbat mazmunini chop etish o'rniga, biz while siklidan va turli navbat usullaridan foydalandik.

example.cpp
while(!animals.empty()) {
  cout << animals.front() << ", ";
  animals.pop();
}

Buning sababi, STL navbati STL Container Adapter bo'lib, u standart navbat ma'lumotlar tuzilmasi kabi harakat qilish uchun cheklovchi kirishni ta'minlaydi.

Natijada, biz vectors yoki boshqa containers orqali takrorlash kabi navbatni takrorlay olmaymiz.

Buning o'rniga, biz uning old qismini chop qilamiz va keyin navbat bo'sh bo'lgunga qadar elementni sikl ichida qayta-qayta ochamiz.

Biz keyingi bo'limlarda pop() , front() va empty() haqida bilib olamiz.

Navbatning old qismidan elementni olib tashlash uchun pop() usulidan foydalanishimiz mumkin. Masalan,

example.cpp
#include <iostream>
#include <queue>
using namespace std;

// display_queue yordam dasturi uchun funksiya prototipi
void display_queue(queue<string> q);

int main() {

  // qatorlar qatorini yarating
  queue<string> animals;

  // elementni navbatga surish
  animals.push("Cat");
  animals.push("Dog");
  animals.push("Fox");
  
  cout << "Initial Queue: ";
  display_queue(animals);
  
  // elementni navbatdan olib tashlang
  animals.pop();
  
  cout << "Final Queue: ";
  display_queue(animals);
  
  return 0;
}

// navbatni ko'rsatish uchun yordamchi dastur
void display_queue(queue<string> q) {
  while(!q.empty()) {
    cout << q.front() << ", ";
    q.pop();
  }

  cout << endl;
}

Chiqish

kod
Initial Queue: Cat, Dog, Fox, 
Final Queue: Dog, Fox,

Yuqoridagi misolda biz navbatdan elementni olib tashlash uchun pop() usulidan foydalandik.

Dastlab, navbatning mazmuni "Cat" , "Dog" va "Fox" .

example.cpp
// oldingi elementni olib tashlaydi
animals.pop();

Bu erda animals.pop() navbatning old qismidagi elementni, ya'ni "Cat" bo'lgan boshida kiritilgan elementni olib tashlaydi.

Demak, oxirgi navbatda "Dog" va "Fox" elementlari mavjud.

Biz quyidagi usullar yordamida queue elementlariga kirishimiz mumkin:

-front() - navbatning oldingi qismidan elementni qaytaradi -back() - navbatning orqa qismidagi elementni qaytaradi

Masalan,

example.cpp
#include <iostream>
#include <queue>
using namespace std;

int main() {

  // int qatorini yarating
  queue<int> nums;

  // elementni navbatga surish
  nums.push(1);
  nums.push(2);
  nums.push(3);
  
  // oldingi elementni oling
  int front = nums.front();
  cout << "First element: " << front << endl;
  
  // orqa tarafdagi elementni oling
  int back = nums.back();
  cout << "Last element: " << back << endl;
  
  return 0;
}

Chiqish

kod
First element: 1
Last element: 3

Yuqoridagi misolda biz front() va back() usullaridan sonlar deb nomlangan butun sonlar qatoridan birinchi va oxirgi elementlarni olish uchun foydalandik.

Biz birinchi elementni, ya'ni oldingi elementni olishimiz mumkin:

example.cpp
// 1 qaytaradi
nums.front()

Bu erda birinchi bo'lib 1 qo'yilgan, shuning uchun u old tomonda.

Xuddi shunday, biz oxirgi elementni, ya'ni orqa (orqa) elementni topamiz:

example.cpp
// qaytaradi 3
nums.back()

Bu erda 3 oxirgi kiritilgan, shuning uchun u orqada.

queue dagi elementlar sonini olish uchun size() usulidan foydalanamiz. Masalan,

example.cpp
#include <iostream>
#include <queue>
using namespace std;

int main() {

  // qatorlar qatorini yarating
  queue<string> languages;

  // elementni navbatga surish
  languages.push("Python");
  languages.push("C++");
  languages.push("Java");
  
  // navbat hajmini oling
  int size = languages.size();
  cout << "Size of the queue: " << size;

  return 0;
}

Chiqish

kod
Size of the queue: 3

Yuqoridagi misolda biz tillar deb nomlangan qatorlar qatorini yaratdik va unga uchta element qo'shdik.

Keyin navbatdagi elementlar sonini topish uchun size() usulidan foydalandik:

example.cpp
// qaytaradi 3
languages.size();

Navbatga uchta element qo'shganimiz sababli, languages.size() 3 ni qaytaradi.

queue bo'sh yoki yo'qligini tekshirish uchun empty() usulidan foydalanamiz. Bu usul qaytaradi:

  • 1 (to'g'ri) - agar navbat bo'sh bo'lsa
  • 0 (noto'g'ri) - agar navbat bo'sh bo'lmasa

Masalan,

example.cpp
#include <iostream>
#include <queue>
using namespace std;

int main() {

  // qatorlar qatorini yarating
  queue<string> languages;
  
  cout << "Is the queue empty? ";

  // navbat bo'sh yoki yo'qligini tekshiring
  if (languages.empty()) {
    cout << "Yes" << endl;
  }
  else {
    cout << "No" << endl;
  }

  cout << "Pushing elements..." << endl;

  // elementni navbatga surish
  languages.push("Python");
  languages.push("C++");
 
  cout << "Is the queue empty? ";

  // navbat bo'sh yoki yo'qligini tekshiring
  if (languages.empty()) {
    cout << "Yes";
  }
  else {
    cout << "No";
  }

  return 0;
}

Chiqish

kod
Is the queue empty? Yes
Pushing elements...
Is the queue empty? No

Yuqoridagi misolda biz queue bo'sh yoki yo'qligini aniqlash uchun empty() usulidan foydalanganmiz,

example.cpp
if (languages.empty()) {
  cout << "Yes" << endl;
}
else{
  cout << "No" << endl; 
}

Dastlab, navbatda unda hech qanday element yo'q. Shunday qilib, languages.empty() true ni qaytaradi.

Keyin navbatga elementlarni qo'shamiz.

Keyin navbat bo'sh yoki yo'qligini aniqlash uchun yana languages.empty() dan foydalanamiz. Bu safar false ni qaytaradi.

Shuningdek oʻqing