C++ Başlangıç Temelleri : Kuyruk Nedir? Nasıl Kullanılır?
Merhaba HackerHub takipçileri, Kuyruk yapısı bir çok işlemde kullanılan bir Listeleme yapısına benzer özelliğe sahip ancak farklı özellikleri de içerisinde barındıran bir C++ metodudur. İçerisinde bir çok farklı metot çalıştırılır, bunlar initialize(q), isEmpty(q), enqueue(q, data), dequeue(q), peek(q), size(q), clear(q), isFull(q) olarak her bir ayrı özelliğe ayrılır.
Konu yapısını daha iyi anlamanız için bilmeniz gereken konular :
İnitialize Nedir? Özellikleri Nelerdir?
İntialize kuyruğu başlatmak veya sıfırlamak amaçları ile kullanılır. Front ve Rear değişkenleri NULL'a eşitlenmekte ve eleman sayısını içerisinde tutan Count değişkeni ise sıfıra eşitlenerek sıfırlama veya kuyruk başlatımı yapılabilmektedir.
Kod Bloğu :
#include <iostream>
void intialize{
int count = 0;
int rear = NULL;
int front = NULL;
}
isEmpty Nedir? Özellikleri Nelerdir?
Kod Bloğu :
#include <iostream>
using namespace std;
struct Queue {
int front, rear, count;
Queue() { // Kuyruğu başlatan constructor
front = rear = -1; // Başlangıçta boş
count = 0;
}
bool isEmpty() { // Kuyruğun boş olup olmadığını kontrol et
return count == 0; // Eğer eleman yoksa TRUE döner
}
};
int main() {
Queue q; // Yeni bir kuyruk oluşturduk
if (q.isEmpty()) {
cout << "Kuyruk şu anda BOŞ!" << endl;
} else {
cout << "Kuyrukta eleman var!" << endl;
}
return 0;
}
Enqueue(q, data) Nedir? Özellikleri Nelerdir?
Enqueue sıranın sonuna eleman ekleme işlemidir. Son gelen eleman her zaman sıranın sonuna eklenir. FIFO kuralı olarak bilinmektedir bu işlem, kısa bir örneklendirme ile daha iyi anlamanızı sağlayalım!
Otobüs Durağı Analojisi:
Yeni bir yolcu durağa geldiğinde, en arkaya geçer. Önce gelenler önde bekler, yeni gelen arkaya eklenir.
Rear : Sona eklenen elemanı ifade eder.Front : En başa eklenen elemanı ifade eder.
Yeni bir eleman eklediğimiz de Rear'a yani sona eklenecektir. Arr diye bir değişken tanımlıyoruz ve bu değişken kuyruğun kendisi olacaktır. Kod satırında arr[rear] komutunu da eklediğimiz de her eklenen eleman kuyruğun içerisinde sona kaydırmalı şekilde sıralanacak şekilde olacaktır.
Kısacası Rear her arttığın da bir sonraki indeks elemanını işaret edecek ve oradaki elemana ekleme yapılacaktır.
Kod Bloğu :
#include <iostream>
#define SIZE 5
using namespace std;
struct Queue {
int arr[SIZE]; // Kuyruk dizisi
int front, rear, count;
Queue() { // Kuyruğu başlat
front = rear = -1;
count = 0;
}
bool isFull() {
return count == SIZE;
}
void enqueue(int data) { // Eleman ekleme işlemi
if (isFull()) {
cout << "Kuyruk DOLU! Eleman eklenemez.\n";
return;
}
if (front == -1) front = 0;
rear = (rear + 1) % SIZE;
arr[rear] = data;
count++;
cout << data << " kuyruğa eklendi. Rear: " << rear << endl;
}
};
int main() {
Queue q;
q.enqueue(10);
q.enqueue(20);
q.enqueue(30);
q.enqueue(40);
q.enqueue(50);
return 0;
}
Dequeue(q) Nedir? Özellikleri Nelerdir?
Dequeue'nin temel amacı eleman çıkartmaktır en baştaki elemanı çıkartarak Front sayısı 1 arttırılır, Rear sabit kalır. Front ile Rear arasındaki elemanlar kullanılır fiziksel olarak 0 indeks'deki eleman orda bulunsa da artık front 0'ncı indeksten 1 indekse çıkartıldığı için kullanılmaz.
Hem Enqueue hemde Dequeue içeren bir örnek:
#include <iostream>
#define SIZE 5
using namespace std;
struct Queue {
int arr[SIZE];
int front, rear, count;
Queue() {
front = rear = -1;
count = 0;
}
bool isFull() {
return count == SIZE;
}
bool isEmpty() {
return count == 0;
}
void enqueue(int data) {
if (isFull()) {
cout << "Kuyruk DOLU! Eleman eklenemez.\n";
return;
}
if (front == -1) front = 0;
rear = (rear + 1) % SIZE;
arr[rear] = data;
count++;
cout << data << " kuyruğa eklendi. Rear: " << rear << endl;
}
void dequeue() {
if (isEmpty()) {
cout << "Kuyruk BOŞ! Eleman çıkarılamaz.\n";
return;
}
cout << arr[front] << " kuyruğundan çıkarıldı.\n";
front = (front + 1) % SIZE;
count--;
if (count == 0) {
front = rear = -1;
}
}
void display() {
if (isEmpty()) {
cout << "Kuyruk BOŞ!\n";
return;
}
cout << "Kuyruk elemanları: ";
for (int i = 0, index = front; i < count; i++) {
cout << arr[index] << " ";
index = (index + 1) % SIZE;
}
cout << endl;
}
};
int main() {
Queue q;
q.enqueue(10);
q.enqueue(20);
q.enqueue(30);
q.enqueue(40);
q.enqueue(50);
q.display();
q.dequeue();
q.dequeue();
q.display();
return 0;
}
Burada yapılan işlem rear[5] ve düşünelim front[0] düşünelim.
1[0] 2[1] 3[2] 4[3] 5[4] 6[5]
Front [0] : İndekste Rear ile aynı elemanları tutarlar 0 ile 5 indeksinin arasında "1,2,3,4,5,6" olduğunu
düşünelim. Front 1 arttığında artık 0 indeksi kullanılmayacak bir arttırarak bizim kullanmadığımız indeksi belirtiriz bu işlemde ise artık
Front Rear2[1] 3[2] 4[3] 5[4] 6[5]"2,3,4,5,6" olarak indekslerimizi çağırdığımız da çıktı alabiliriz artık!
Display Nedir? Özellikleri Nelerdir?
void display(){
if(isEmpty()) {
cout << "Kuyruk boş, eleman yazdırılamaz!" << endl;
return;
}
cout<<"Elemanlar: "<<endl;
for(int i = 0, index = front;i < count;i++){
cout<<arr[index]<<endl;
index = (index + 1) % SIZE;
}
}
Display Oluştururken Neler Yaptık?
- Boş mu kontrolü yapmak için isEmpty methodu if blogu içerisinde çağrılır.
- Boş olması durumunda cout komutu ile ekrana yazdırma işlemi uygulanır.
- İf blogu kapatılıp çakışma olmaması için cout ile "Elemanlar :" isminde bir çıktı oluşturuyoruz!
- For bloğu açıyoruz ve "i,index" isminde 2 int türünde değişken oluşturuyoruz.
- index değişkeninin içerisine front değişkenini atıyoruz.
- count bizim kuyruk içerisinde ki eleman sayımızı tutan değişkenimiz i count'a eşit olduğunda for değişkeninin false dönmesi yani durmasını söylemek için "<=" operatörünü kullanacağız!
- i++ operatörünü her döngü çalıştığında i değişkeni bir artması için kullanacağız.
- Her döngüde ekrana yazdırması için : cout<<arr[index]<<" ";
- her arttığında o indeks sayısında ki eleman gösterilir ve her döngüde 1 artması için yani indeks'in 1 arttırılması için : "index = index + 1;"
- return komutu ile metotumuzu bitiriyoruz!
Bir çok metot'un detaylı anlatımını yaptık şimdi ise bu metotlar ile bir script oluşturalım!
Örnek Kuyruk Bloğu:
#include <iostream>
#define SIZE 5
using namespace std;
struct Queue {
int arr[SIZE];
int front, rear, count;
Queue(){
front = rear = -1;
count = 0;
}
bool isEmpty(){
return count == 0;
}
bool isFull(){
return count == SIZE;
}
void enqueue(int data){
if(isFull()){
cout << "Kuyruk dolu! Yeni eleman ekleyemezsiniz." << endl;
return;
}
if(front == -1) front = 0;
rear = (rear + 1) % SIZE;
arr[rear] = data;
count++;
cout << data << " kuyruğa eklendi. (Konum: " << rear << ")" << endl;
}
void dequeue(){
if(isEmpty()){
cout << "Kuyruk boş, çıkarma işlemi yapılamaz!" << endl;
return;
}
cout << "Çıkarılan eleman: " << arr[front] << endl;
front = (front + 1) % SIZE;
count--;
if(count == 0) {
front = rear = -1;
}
}
void display(){
if(isEmpty()){
cout << "Kuyruk şu an boş. Görüntüleme yapılamaz." << endl;
return;
}
cout << "Kuyruktaki elemanlar: ";
for(int i = 0, index = front; i < count; i++){
cout << arr[index] << " ";
index = (index + 1) % SIZE;
}
cout << endl;
}
};
int main(){
Queue q;
int secim, sayi;
while (true) {
cout << "\n1. Eleman Ekle\n2. Eleman Çıkar\n3. Kuyruğu Göster\n4. Kuyruğu Temizle\n5. Çıkış\nSeçiniz: ";
cin >> secim;
switch(secim){
case 1:
cout << "Eklemek istediğiniz elemanı giriniz: ";
cin >> sayi;
q.enqueue(sayi);
break;
case 2:
q.dequeue();
break;
case 3:
q.display();
break;
case 4:
q = Queue();
cout << "Kuyruk başarıyla temizlendi." << endl;
break;
case 5:
cout << "Çıkış yapılıyor... Allah'a emanet olun!" << endl;
exit(0);
default:
cout << "Yanlış seçim! Lütfen tekrar deneyin." << endl;
}
}
}
Daha fazla metot anlatımı ve diğer C++ konuları için buraya tıklayınız! Konu devamı gelecektir, blog adresimizi takip etmeye devam edin konunun daha pratik anlatım ve akılda kalıcı anlatımları blog adresimiz de siz değerli takipçilerimize paylaşılacaktır.
Post a Comment