You are on page 1of 8

6- AMALIY ISH

Mavzu: Konteyner adapterlari. Stack, queue, priority queue.


Ishning maqsadi: Ushbu laboratoriyada konteyner adapterlarini o’rganish
uchun misoillar beilgan. Misollarni konteyner adapterlarning elementlari bo’lgan
setek, queue va priority_queue tuzilmalaridan foydalangan holda yechish kerak.
NAZARIY QISM
C++ standart kutubxonasida konteyner adapterlarining uch turi aniqlangan:
stack,
navbat(queue);
priority_queue.
Stack, queue va priority queue, ma'lumotlar strukturasi sifatida qo'llaniladigan
amallar to'plamlaridir, lekin ularga mos ravishda ma'lumotlarni qabul qilish, saqlash
va o'qish imkoniyatlarini ta'minlashda farq qiladi.
1. **Stack** (Stek) - Bu ma'lumotlar strukturasi "last-in, first-out" (LIFO)
tartibida ishlaydi. Bu degani, eng oxirgi kiritilgan ma'lumot eng avval chiqariladi.
Stekda ma'lumotlar qo'shilgandan so'ng uning ustiga qo'shiladi va yozilgan tartibning
teskarisi bo'yicha chiqariladi. Stek o'rtasiga ma'lumot qo'shish uchun `push`
funksiyasi, va uning ustidan ma'lumot olish uchun `pop` funksiyasi ishlatiladi.
2. **Queue** (Navbat) - Bu ma'lumotlar strukturasi "first-in, first-out" (FIFO)
tartibida ishlaydi. Bu degani, eng birinchi kiritilgan ma'lumot eng birinchi chiqariladi.
Navbatda ma'lumotlar qo'shilgandan so'ng uning oxiriga qo'shiladi va yozilgan tartib
bo'yicha chiqariladi. Navbatga ma'lumot qo'shish uchun `enqueue` funksiyasi, va
uning boshidan ma'lumot olish uchun `dequeue` funksiyasi ishlatiladi.
3. **Priority Queue** (Darajali Navbat) - Bu ma'lumotlar strukturasi ham
"first-in, first-out" (FIFO) tartibida ishlaydi, lekin har bir ma'lumotga bir daraja
(prioritet) beriladi. Darajali navbatda ma'lumotlar qo'shilgandan so'ng uning
darajasiga ko'ra joylashtiriladi, va uning darajasi bo'yicha chiqariladi. Darajali
navbatga ma'lumot qo'shish uchun `enqueue` funksiyasi, va uning boshidan ma'lumot
olish uchun `dequeue` funksiyasi ishlatiladi.
Asosiy farq, ushbu ma'lumotlar strukturasi o'z ichiga ma'lumotlarni saqlash va
ularga murojat qilish tartibini tuzishidir. Stek va navbat ma'lumotlar strukturasi "first-
in, first-out" (FIFO) va "last-in, first-out" (LIFO) tartibida ishlaydigan holda, priority
queue ma'lumotlarni darajasiga ko'ra joylashtiradi va uni o'sish qiyinchilik darajasiga
ko'ra chiqaradi.
Har biri standart ma'lumotlar tuzilishi uchun aniq boshqariladigan interfeysni
ta'minlash uchun ba'zi bazaviy konteynerlar sinfining funktsional imkoniyatlarini
cheklaydi. Stek deb shunday strukturaga aytiladiki, stekka kelib tushgan oxirgi
elementga birinchi bo’lib xizmat ko’rsatiladi va stekdan chiqariladi. Mazkur
ko’rinishdagi xizmat ko’rsatishni LIFO (Last input-First output, ya’ni oxirgi kelgan –
birinchi ketadi) nomlash qabul qilingan. Stek bir tomondan ochiq bo’ladi.
Stekni amalga oshirish (sonlarni)
Struktura-stek:
const MAXSIZE = 100;
struct Stack {
char data[MAXSIZE]; // 100 ta simvolli stek
int size; // elementlar soni
};
Element qo’shish:
int Push ( Stack &S, char x )
{
if ( S.size == MAXSIZE ) return 0;
S.data[S.size] = x;
S.size ++;
return 1;
}
Boshidan elementni o’chirish:
char Pop ( Stack &S )
{
if ( S.size == 0 ) return char(255);
S.size --;
return S.data[S.size];
}
Bo’shmi yoki yo’q?
int isEmpty ( Stack &S )
{
return (S.size == 0);
}
stack uchun aniqlangan funksiyalar

empty() funksiyasi

queue sinfi
Old va orqa elementlarga kirishni cheklab qo'yadigan ba'zi bir konteyner
turi uchun ishlashni cheklashni ta'minlaydigan shablon konteyner adapteri sinfidir.
Elementlar orqa tomondan qo'shilishi yoki old tomondan olib tashlanishi mumkin va
elementlarni navbatning oxirida tekshirish mumkin.
Sintaksisi: Container = deque <Type>> class queue
queue - navbat
template <class Type, class
Biz navbat bilan ko’p joylarda duch kelamiz: magazinda, o’qishda, ishda va
hokazo. Odatda biz unga e’tibor bermaymiz. Dasturiy tizimlarda ham bu navbat
tushunchasi ishlatiladi.
Masalan, hujjatni chop etish uchun printerga jo’natsak, u navbatga turadi.
Navbat – chiziqli ma’lumotlar strukturasi bo’lib, elementni faqat
navbat oxiridan kiritish (navbat oxiri), elementni o’chirish esa faqat
navbat boshqa oxiridan amalga oshiriladi (navbat boshi).
FIFO = First In – First Out
«Birinchi kelgan, birinchi ketadi».
Navbat ustida amallar:
1) Navbat oxiridan element qo’shish (PushTail = oxiridan kiritish);
2) Navbat boshidan elementni o’chirish (Pop).
queue uchun aniqlangan funksiyalar

Queue orqali stack yaratish

Navbat (asosiy funksiyalar)


void pop(struct que*p) – navbat boshidagi elementni o’chirish.
void push(struct que*p, void* val) –navbat oxiriga element qo’shish. Bu yerda val
kiritilayotgan ma’lumotga ko’rsatkich.
int empty(struct que p) – navbat bo’shligini tekshirish.
int size (struct que p) – navbat elementlari soni.
Bundan tashqari navbatni inisiallash uchun quyidagi sarlavhali funksiya kiritilgan.
void ini_que(struct que* p,int n) – Bu yerda n kiritilayotgan ma’lumotlar hajmi.
Masala: Navbatning boshidagi va oxiridagi elementni topish dasturi:
#include <iostream>
#include <queue>

using namespace std;


int main() {
queue <int> q;
int n;
cout<<"Navbat elementlari sonini kiriting: n = ";
cin>>n;
cout<<"Navbat elementlarini kiriting:\n";
for(int i=1; i<=n; i++){
int k;
cin>>k;
q.push(k);
}
cout<<"Navbatning 1-elementi: "<<q.front();
cout<<endl<<"Navbatning oxirgi elementi: "<<q.back();
}
Priority_queue sinfi
Priority_queue - har doim eng yuqori yoki eng yuqori ustuvorlikka ega bo'lgan
ba'zi bir asosiy konteyner turining yuqori elementiga kirishni cheklaydigan
funktsiyani cheklashni ta'minlaydigan shablon konteyner adapteri sinfidir.
Priority_queue-ga yangi elementlar qo'shilishi mumkin, va prioritet_queue ustki
elementi tekshirilishi yoki olib tashlanishi mumkin.
Sintaksisi:
template <class Type, class Container= vector <Type>, class Compare= less <typename
Container ::value_type>> class priority_queue
Push(), Pop() va Top() funksiyalaridan foydalanish

MISOL NAMUNALARI
Misol: sonli ketmaketlik berilgan. Ushbu sonlardan eng kattasini stekdan foydalangan holda
yechish dasturini tuzing.
TOPSHIRIQLAR

1-topshiriq.Keltirilgan topshiriqlarni stek,queue va priority_queue dan


foydalangan holda yeching
Berilgan sonlar ketma-ketligida sonlarning elementlarini kvadratlarini
1.
yigindisi va o’rtacha qiymati hisoblansin.
Berilgan sonlar ketma-ketligida barcha elementlari shu sonlarni eng katta
2.
elementiga bo’lib chiqilsin.
Berilgan sonlar ketma-ketligida barcha elementlari shu sonlarni eng kichik
3.
elementiga bo’lib chiqilsin.
Berilgan sonlar ketma-ketligida M dan katta elementlarini ko’paytmalari
4.
hisoblansin.
Berilgan sonlar ketma-ketligida sonlarni M dan katta elementlari yigindisi
5.
hisoblansin.
Berilgan sonlar ketma-ketligida M dan kichik elementlarini kvadratlarini
6.
ko’paytmasi hisoblansin.
Berilgan sonlar ketma-ketligida elementlari sonlarni eng katta elementini
7.
kvadratiga bo’lib chiqilsin.
Berilgan sonlar ketma-ketligida toq qiymatli elementlarini o’rtacha
8.
qiymati hisoblansin.
Berilgan sonlar ketma-ketligida elementlarini kvadratlari yigindisi va
9.
o’rtacha qiymati hisoblansin
10. Berilgan sonlar ketma-ketligida toq qiymatli elementlarining yig’indisi juft
qitmatli elementlari yigindisiga bo’lib chiqilsin.
11. Berilgan sonlar ketma-ketligida toq qiymatli elementlarining yig’indisi
topilsin
12. Berilgan sonlar ketma-ketligida juft qiymatli elementlarining yig’indisi
topilsin

2-topshiriq Keltirilgan topshiriqlarni aytilgan konteynerdan foydalangan


holda yeching

Navbat o‘rtasidagi element o‘chirib tashlansin. Agar navbat elementlari


1
soni toq bo‘lsa, bitta element, aks holda ikkita element o‘chirilsin.
2 Navbatni juft o‘rinda turgan elementlari o‘chirilsin.
3 Navbat eng kichik elementi topilsin va undan keyin 0 joylashtirilsin.
4 Navbat eng kichik elementi o‘chirilsin.
5 Navbat o‘rtasiga '+' belgi joylashtirilsin.
6 Stek birinchi va oxirgi elementlari o‘rni almashtirilsin.
7 Stek elementlari teskari tartibda joylashtirib chiqilsin.
Stek o‘rtasidagi element o‘chirib tashlansin. Agar stek elementi toq bo‘lsa,
8
bitta element, aks holda ikkita element o‘chirilsin.
9 Stekning juft o‘rinda turgan elementlari o‘chirilsin.
10 Stek eng katta elementi topilsin va undan keyin 0 joylashtirilsin
11 Stekning har 2 ta elementidan keyin ularning yig‘indisini joylang.
12 Stekning o‘rtasidagi element yoki elementlarni o‘chiring.
13 Stekning juft elementlari yig‘indisini hisoblang.

You might also like