Download - Stack-queue Tr OK

Transcript
Page 1: Stack-queue Tr OK

Yığın ve Kuyruk

Page 2: Stack-queue Tr OK

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

Page 3: Stack-queue Tr OK

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.

Page 4: Stack-queue Tr OK

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.

Page 5: Stack-queue Tr OK

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

Page 6: Stack-queue Tr OK

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.

Page 7: Stack-queue Tr OK

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.

Page 8: Stack-queue Tr OK

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

};

Page 9: Stack-queue Tr OK

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.

Page 10: Stack-queue Tr OK

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.

Page 11: Stack-queue Tr OK

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;}

Page 12: Stack-queue Tr OK

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--];}

}

Page 13: Stack-queue Tr OK

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];}

Page 14: Stack-queue Tr OK

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;

}

Page 15: Stack-queue Tr OK

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

Page 16: Stack-queue Tr OK

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;

};

Page 17: Stack-queue Tr OK

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.

Page 18: Stack-queue Tr OK

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.

Page 19: Stack-queue Tr OK

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.

Page 20: Stack-queue Tr OK

Yığın ve Kuyruk / Sunum 20

Page 21: Stack-queue Tr OK

Yığın ve Kuyruk / Sunum 21

Kuyruk İçerik

Kuyruk SVTTemek kuyruk işlemleri

Enqueuing, dequeuing etc.Kuyruk gerçekleştirmesi

DiziBağlantılı Liste

Page 22: Stack-queue Tr OK

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.

Page 23: Stack-queue Tr OK

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

Page 24: Stack-queue Tr OK

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

Page 25: Stack-queue Tr OK

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.

Page 26: Stack-queue Tr OK

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

Page 27: Stack-queue Tr OK

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

Page 28: Stack-queue Tr OK

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.

Page 29: Stack-queue Tr OK

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.

Page 30: Stack-queue Tr OK

Yığın ve Kuyruk / Sunum 30

Page 31: Stack-queue Tr OK

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.

Page 32: Stack-queue Tr OK

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

};

Page 33: Stack-queue Tr OK

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

Page 34: Stack-queue Tr OK

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;

}

Page 35: Stack-queue Tr OK

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;

}

Page 36: Stack-queue Tr OK

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;

}}

Page 37: Stack-queue Tr OK

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;

}}

Page 38: Stack-queue Tr OK

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;}

}

Page 39: Stack-queue Tr OK

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;

}

Page 40: Stack-queue Tr OK

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

};

Page 41: Stack-queue Tr OK

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

Page 42: Stack-queue Tr OK

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

Page 43: Stack-queue Tr OK

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;

}}

Page 44: Stack-queue Tr OK

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


Top Related