Download - Stack-queue Tr OK
Yığın ve Kuyruk
Yığın ve Kuyruk / Sunum 2
Yığın İçerik
Yığın SVTYığının temel işlemleri
Pushing, popping etc. Yığının gerçekleştirilmesi
dizilerlebağlantılı listelerle
Yığın ve Kuyruk / Sunum 3
Yığın SVT
Yığın kısıtlanmış bir liste olarak tanımlanabilir. ekleme ve silme sadece listenin tepesinden (top) yapılabilir.
Diğer uç alt (bottom) olarak isimlendirilir.
Temel İşlemler:Push: ekle işleminin eşdeğeridirPop: en son eklenen elemanı silerTop: en son eklenen elemanı pozisyonunu tutar.
Yığın ve Kuyruk / Sunum 4
Yığın SVTYığınların esnekliği sınırlıdır.
fakat uygulanması daha etkili ve kolaydır. Yığınlar LIFO (Last In, First Out) listeler olarak bilinirler.
Eklenen en son eleman, her zaman çağrılan ilk eleman olacaktır.
Yığın ve Kuyruk / Sunum 5
Push ve PopBirincil işlemler : Push and PopPush
Yığının tepesine bir eleman eklePop
Yığının tepesindeki elemanı sil
Atepe(top)
boş yığın
top
top
top
push:eleman ekle push:yeni eleman ekle
A
B
pop
A
Yığın ve Kuyruk / Sunum 6
Yığınların Gerçekleştirilmesi
Bir yığını gerçekleştirmek için herhangi bir liste gerçekleştirilmesi kullanılabilir.
Diziler (statik: en başta yığının boyutu belirtilmeli)Bağlantılı listeler (dinamik: asla dolmaz)
Dizi ve bağlantılı liste gerçekleştirmeleri görülecek. Öncelikle dizi gerçekleştirmesini görelim.
Yığın ve Kuyruk / Sunum 7
Dizi GerçekleştirmesiEn başta dizi boyutunun belirtilmesi gerekir. Her yıpında TopOfStack bilgisi tutulur.
boş bir yığın için , TopOfStack -1 olarak ayarlanır.Push
(1) TopOfStack değerini 1 arttır.(2) Yığın[TopOfStack] = X atamasını yap.
Pop(1) Return deperine Stack[TopOfStack] olarak ayarla.(2) TopOfStack değerini 1 azalt.
Bu işlemler çok hızlı yapılır. Karmaşıklığı sabit zamandır.
Yığın ve Kuyruk / Sunum 8
Stack sınıfıclass Stack {public:
Stack(int size = 10); // constructor~Stack() { delete [] values; } // destructorbool IsEmpty() { return top == -1; }bool IsFull() { return top == maxTop; }double Top();void Push(const double x);double Pop();void DisplayStack();
private:int maxTop; // max stack size = size - 1int top; // current top of stackdouble* values; // element array
};
Yığın ve Kuyruk / Sunum 9
Stack sınıfıStack in özellikleri
maxTop: yığının maksimum boyututop: yığının tepesini gösteren indeksvalues: yığın elemanlarını depolayan diziyi işaret eder.
Stack in işlemleriIsEmpty: eğer yığın boş ise true, diğer durumda ise false dönderir. IsFull: yığın dolu ise true, diğer durumda ise false dönderir. Top: yığının tepe indeksinin dönderir. Push: yığının tepesine eleman ekler. Pop: yığının tepesinden eleman siler.DisplayStack: yığındaki bütün elemanları ekrana yazar.
Yığın ve Kuyruk / Sunum 10
Yığın OluşturmaStack ın kurucusu (constructor)
size kadar bir yığın dizisi yeri ayır. Varsayılan (default)size = 10.Yığın dolduğunda, top maksimum değeri alacak, yani size – 1.En başta top değeri -1 dir. Bu yığının boş olduğunu gösterir.
Stack::Stack(int size /*= 10*/) {maxTop = size - 1;values = new double[size];top = -1;
}
Kurucu yığın dizisi için dinamik olarak yer ayırmasına rağmen, yığın hala statiktir. Dizi boyutu başlatıldıktan (initialization) sonra sabitlenir.
Yığın ve Kuyruk / Sunum 11
Yığına Ekleme (Push)void Push(const double x);
Yığının tepesine eleman ekleEğer yığın dolu ise, hata mesajı ver. top her zaman en üstteki elemanı temsil eder. Bir eleman ekledikten sonra, top değerini 1 arttır.
void Stack::Push(const double x) {if (IsFull())
cout << "Error: the stack is full." << endl;else
values[++top] = x;}
Yığın ve Kuyruk / Sunum 12
Yığından Silme (Pop)double Pop()
Yığının tepesindeki elemanı dönder. Eğer yığın boş ise, hata mesajı ver. (Bu durumda geri dönen değer faydasızdır.)top değeri 1 azaltılır.
double Stack::Pop() {if (IsEmpty()) {
cout << "Error: the stack is empty." << endl;return -1;
}else {
return values[top--];}
}
Yığın ve Kuyruk / Sunum 13
Yığının Tepesi (Top)double Top()
Yığının tepesindeki elemanı dönder. Pop olduğu gibi, bu fonksiyon yığının tepedeki elemanı silmez.
double Stack::Top() {if (IsEmpty()) {
cout << "Error: the stack is empty." << endl;return -1;
}else
return values[top];}
Yığın ve Kuyruk / Sunum 14
Bütün elemenları yazma
void DisplayStack()Bütün elemanları yazar.
void Stack::DisplayStack() {cout << "top -->";for (int i = top; i >= 0; i--)
cout << "\t|\t" << values[i] << "\t|" << endl;cout << "\t|---------------|" << endl;
}
Yığın ve Kuyruk / Sunum 15
Stack kullanımı
int main(void) {Stack stack(5);stack.Push(5.0);stack.Push(6.5);stack.Push(-3.0);stack.Push(-8.0);stack.DisplayStack();cout << "Top: " << stack.Top() << endl;
stack.Pop();cout << "Top: " << stack.Top() << endl;while (!stack.IsEmpty()) stack.Pop();stack.DisplayStack();return 0;
}
result
Yığın ve Kuyruk / Sunum 16
List kodunu en iyi şekilde kullanabilmek için, Stack’i List‘i inherit ederek gerçekleştirebiliriz.
Stack’in private üye olan head’e erişimi sağlamak için, Stack’ı List’in arkadaşı (friend) yaparız.
Bağlantılı Liste tabanlı Gerçekleştirmesi
class List {public:
List(void) { head = NULL; } // constructor~List(void); // destructorbool IsEmpty() { return head == NULL; }Node* InsertNode(int index, double x);int FindNode(double x);int DeleteNode(double x);void DisplayList(void);
private:Node* head;friend class Stack;
};
Yığın ve Kuyruk / Sunum 17
Bağlantılı Liste tabanlı Gerçekleştirmesiclass Stack : public List {public:
Stack() {} // constructor~Stack() {} // destructordouble Top() {
if (head == NULL) {cout << "Error: the stack is empty." << endl;return -1;
}else
return head->data;}void Push(const double x) { InsertNode(0, x); }double Pop() {
if (head == NULL) {cout << "Error: the stack is empty." << endl;return -1;
}else {
double val = head->data;DeleteNode(val);return val;
}}void DisplayStack() { DisplayList(); }
};
Note: the stack implementation based on a linked list will never be full.
Yığın ve Kuyruk / Sunum 18
Sembollerin Takip EdilmesiParantez veya köşeli parantez açma yine parantez veya köşeli parantez kapama ile bitmeli
örnek [( )] doğru, fakat [( ] ) yanlışAlgoritma(1) Boş bir yığın yap.(2) Dosya sonuna kadar karakterleri oku
i. Eğer karakter açma sembolü ise, yığına ekleii. Eğer parantez kapama sembolü ise yığını boşalt ve hata rapor et. iii. Diğer durumda yığından sil. Eğer silinen sembol açma sembolünün
karşılığı değilse hata rapor et. (3) Dosya sonunda, eğer yığın boş değilse hata mesajı ver.
Yığın ve Kuyruk / Sunum 19
Sonek (Postfix) İfadeleri4.99 * 1.06 + 5.99 + 6.99 * 1.06 hesapla
Öncelik kurallarını bilmek gerekiyorSonek ifadeleri4.99 1.06 * 5.99 + 6.99 1.06 * +
Sonek ifadelerini hesaplamak için yığın kullanBir sayı geldiğinde, yığına ekleBir işlem geldiğinde, işlem yığından pop edilen iki sayıüzerine uygulanır. Sonuç yığına eklenir.
Örnekhesapla 6 5 2 3 + 8 * + 3 + *
Sonek ifadelerini hesaplamanın zaman karmaşıklığıO(N)
girişteki her bir elemanın işlenmesi yığın işlemlerini içerir ve böylece sabit zaman karmaşıklığına sahiptir.
Yığın ve Kuyruk / Sunum 20
Yığın ve Kuyruk / Sunum 21
Kuyruk İçerik
Kuyruk SVTTemek kuyruk işlemleri
Enqueuing, dequeuing etc.Kuyruk gerçekleştirmesi
DiziBağlantılı Liste
Yığın ve Kuyruk / Sunum 22
Kuyruk SVTYığın gibi, kuyruk (queue ) da bir listedir. Fakat, kuyrukta, ekleme bir uçtan yapılırken, silme diğer uçtan yapılır. Kuyruk elemanlarına erişim First In, First Out (FIFO) düzeni şeklindedir.
Bir markette ödemeyi yapmak için bekleyen müşteriler gibi, sıradaki ilk müşteri ödemeyi yapan ilk kişi olacaktır.
Yığın ve Kuyruk / Sunum 23
Kuyruk SVT
Listenin diğer bir sınırlandırılmış şeklidir. Ekleme bir uçtan yapılırken, silme de diğer uçtan yapılır.
Temel işlemler:enqueue: en arkaya (rear) eleman eklemedequeue: listenin başından eleman silme
First-in First-out (FIFO) liste
Yığın ve Kuyruk / Sunum 24
Enqueue ve DequeueBirincil kuyruk işlemleri: Enqueue and DequeueMarketteki ödeme sırası gibi, kuyrukta bir ön vardır birde arkaEnqueue
Kuyruğun arkasına eleman eklemeDequeue
Kuyruğun önünden eleman silme
Insert (Enqueue)
Remove(Dequeue) arkaön
Yığın ve Kuyruk / Sunum 25
Kuyruğun Gerçekleştirilmesi
Yığınlar gibi diziler ve bağlantılı listeler ile gerçekleştirilebilirDinamik kuyrukların, statik kuyruklara avantajıdinamik yığınların, static yığınlara olan avantajı gibidir.
Yığın ve Kuyruk / Sunum 26
Kuyruğun Dizilerle GerçekleştirilmesiEnqueue ve Dequeue işlemlerinin gerçekleştirilmesi için çeşitli algoritmalar vardır. En basiti
enqueue işleminde ön indeks daima sabittir ve arka indeks dizide ileri doğru hareket eder.
front
rear
Enqueue(3)
3
front
rear
Enqueue(6)
3 6
front
rear
Enqueue(9)
3 6 9
Yığın ve Kuyruk / Sunum 27
Kuyruğun Dizilerle GerçekleştirilmesiNaïve way
enqueue işleminde ön indeks daima sabittir ve arka indeks dizide ileri doğru hareket eder.dequeue işleminde, kuyruğun önündeki eleman silinir. Diğer bütün elemanlar bir öne kayar. (etkili değil!!!)
Dequeue()front
rear
6 9
Dequeue() Dequeue()
front
rear
9
rear = -1
front
Yığın ve Kuyruk / Sunum 28
Kuyruğun Dizilerle GerçekleştirilmesiDaha iyi yol
Bir eleman enqueue olduğunda arka indeksi ileri hareket ettir. Bir eleman dequeue olduğunda, ön indeks kuyruğun arkasına bir eleman hareket eder. (Böylece ön elemanı siler ve komşu elemanları kopyalayıp taşıma olmaz.).
XXXXOOOOO (rear) OXXXXOOOO (1 dequeuedan sonra, ve 1 enqueue)OOXXXXXOO (diğer bir dequeuedan sonra, ve 2 enqueuesOOOOXXXXX (2 dequeuesdan sonra, ve 2 enqueues)
(front)
Buradaki problem, arka indeks dizinin son hücresinden sonra ileri gidemez.
Yığın ve Kuyruk / Sunum 29
Dairesel Diziler kullanarak Gerçekleştirilmesi
Dairesel diziler kullanarakWhen an element moves past the end of a circular array, it wraps around to the beginning, e.g.
OOOOO7963 4OOOO7963 (after Enqueue(4))After Enqueue(4), the rear index moves from 3 to 4.
Yığın ve Kuyruk / Sunum 30
Yığın ve Kuyruk / Sunum 31
Boş veya Dolu?Boş kuyruk
arka = ön - 1Dolu kuyruk?
aynı!Sebep: n+1 durumu göstermek n değer vardır
ÇözümlerKuyruğun boş olup olmadığını gösterecek booleanbir değişken kullanılmasıDizinin boyutunu n+1 yap ve sadece n elemanın depolanmasına izin verKuyruktaki elemanların sayısını tutan bir sayaçkullan.
Yığın ve Kuyruk / Sunum 32Kuyruğun Bağlantılı Liste kullanılarak Gerçekleştirilmesi
class Queue {public:
Queue(int size = 10); // constructor~Queue() { delete [] values; } // destructorbool IsEmpty(void);bool IsFull(void);bool Enqueue(double x);bool Dequeue(double & x);void DisplayQueue(void);
private:int front; // front indexint rear; // rear indexint counter; // number of elementsint maxSize; // size of array queuedouble* values; // element array
};
Yığın ve Kuyruk / Sunum 33
Queue SınıfıKuyruk özellikleri
front/rear: ön/arka indekscounter: kuyruktaki eleman sayısımaxSize: kuyruğun kapasitesivalues: kuyruğun elemanlarını depolayan bir diziye işaret eder
Kuyruk İşlemleriIsEmpty: kuyruk boş ise true, diğer durumda false dönderIsFull: kuyruk dolu ise true, yoksa false dönderEnqueue: kuyruğun arkasına bir eleman ekleDequeue: kuyruktan bir eleman silDisplayQueue: verinin hepsini yaz
Yığın ve Kuyruk / Sunum 34
Kuyruk OluşturQueue(int size = 10)
size boyutundan bir dizi için yer ayarla. Başlanğıçta, size = 10.front değeri 0, dizinin ilk elemanını gösterir.rear değeri -1. Başlanğıçta kuyruk boştur.
Queue::Queue(int size /* = 10 */) {values = new double[size];maxSize = size;front = 0;rear = -1;counter = 0;
}
Yığın ve Kuyruk / Sunum 35
IsEmpty & IsFullcounter, kullanılarak dizinin boş mu dolu mu olduğunu anlamak kolaydır.
bool Queue::IsEmpty() {if (counter) return false;else return true;
}bool Queue::IsFull() {
if (counter < maxSize) return false;else return true;
}
Yığın ve Kuyruk / Sunum 36
Enqueue
bool Queue::Enqueue(double x) {if (IsFull()) {
cout << "Error: the queue is full." << endl;return false;
}else {
// calculate the new rear position (circular)rear = (rear + 1) % maxSize; // insert new itemvalues[rear] = x;// update countercounter++;return true;
}}
Yığın ve Kuyruk / Sunum 37
Dequeue
bool Queue::Dequeue(double & x) {if (IsEmpty()) {
cout << "Error: the queue is empty." << endl;return false;
}else {
// retrieve the front itemx = values[front];// move front front = (front + 1) % maxSize;// update countercounter--;return true;
}}
Yığın ve Kuyruk / Sunum 38
Elemanların Yazılması
void Queue::DisplayQueue() {cout << "front -->";for (int i = 0; i < counter; i++) {
if (i == 0) cout << "\t";else cout << "\t\t"; cout << values[(front + i) % maxSize];if (i != counter - 1)
cout << endl;else
cout << "\t<-- rear" << endl;}
}
Yığın ve Kuyruk / Sunum 39
Queue Kullanımı
int main(void) {Queue queue(5);cout << "Enqueue 5 items." << endl;for (int x = 0; x < 5; x++)
queue.Enqueue(x);cout << "Now attempting to enqueue again..." << endl;queue.Enqueue(5);queue.DisplayQueue();double value;queue.Dequeue(value);cout << "Retrieved element = " << value << endl;queue.DisplayQueue();queue.Enqueue(7);queue.DisplayQueue();return 0;
}
Yığın ve Kuyruk / Sunum 40
Bağlantılı Liste kullanılarak Yığın Gerçekleştirilmesiclass Queue {
public:Queue() { // constructor
front = rear = NULL;counter = 0;
}~Queue() { // destructor
double value;while (!IsEmpty()) Dequeue(value);
}bool IsEmpty() {
if (counter) return false;else return true;
}void Enqueue(double x);bool Dequeue(double & x);void DisplayQueue(void);
private:Node* front; // pointer to front nodeNode* rear; // pointer to last nodeint counter; // number of elements
};
Yığın ve Kuyruk / Sunum 41
Enqueue
void Queue::Enqueue(double x) {Node* newNode = new Node;newNode->data = x;newNode->next = NULL;if (IsEmpty()) {
front = newNode;rear = newNode;
}else {
rear->next = newNode;rear = newNode;
}counter++;
}
8rear
rear
newNode
5
58
Yığın ve Kuyruk / Sunum 42
Dequeuebool Queue::Dequeue(double & x) {
if (IsEmpty()) {cout << "Error: the queue is empty." << endl;return false;
}else {
x = front->data;Node* nextNode = front->next;delete front;front = nextNode;counter--;
}}
8
front
5
583
front
Yığın ve Kuyruk / Sunum 43
Bütün Elemanların Yazdırılması
void Queue::DisplayQueue() {cout << "front -->";Node* currNode = front;for (int i = 0; i < counter; i++) {
if (i == 0) cout << "\t";else cout << "\t\t"; cout << currNode->data;if (i != counter - 1)
cout << endl;else
cout << "\t<-- rear" << endl;currNode = currNode->next;
}}
Yığın ve Kuyruk / Sunum 44
SonuçBağlantılı liste kullanılarak yapılan kuyruk asla dolmayacaktır
Dizi kullanılarak Bağlantılı liste kullanılarak