stack-queue tr ok

Post on 24-Apr-2015

94 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related