YIĞIT STACK. Doç. Dr. Aybars UĞUR

Benzer belgeler
YIĞIT STACK. Yrd. Doç. Dr. Aybars UĞUR

STACK (ÇIKIN-YIĞIN-YIĞIT) VERİ YAPISI LAST-IN-FIRST-OUT LIFO VERİ YAPISI

YZM 2116 Veri Yapıları

VERİ YAPILARI DERS NOTLARI BÖLÜM 4 STACK (YIĞIN, YIĞIT) Yard. Doç. Dr. Deniz KILINÇ

KUYRUKLAR QUEUES. Doç. Dr. Aybars UĞUR

YIĞINLAR YIĞINLAR. Yığın İşlemleri Postfix, Prefix, Infix. G. Ü. Bilgisayar Mühendisliği Bölümü

Yığıtın en üstündeki öğeyi değer olarak alır; ama onu yığıttan almaz, yerinde bırakır.

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

KUYRUKLAR. Doç. Dr. Aybars UĞUR

Yigin & Kuyruk {\} /\ Suhap SAHIN Onur GÖK

Stack Islemleri. Postfix ve Infix notasyonlari. Stack ozellikleri

TEMPLATES. Binnur Kurt Bilgisayar Mühendisliği Bölümü İstanbul Teknik Üniversitesi. C++ ile Nesneye Dayalı Programlama 1

YZM 2116 Veri Yapıları

YMT219 VERİ YAPILARI ÖDEV-1

Arasınav Örnek Soruları Bahar 2018

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Sunum İçeriği. Programlamaya Giriş

11- FONKSİYONLAR (FUNCTIONS)

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

Nesne Yönelimli Programlama

Java da İşleçler, Ders #3 (4 Kasım 2009)

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

İçerik. Java da İşleçler, İşleçler. Aritmetik İşleçler - 1. Aritmetik İşleçler - 2. Geçen ders: Bu ders: BS-515 Nesneye Yönelik Programlama

DÖNGÜLER BMÜ-111 ALGORİTMA VE PROGRAMLAMA-I YRD. DOÇ. DR. İLHAN AYDIN

Lambda İfadeleri (Lambda Expressions)

// hataları işaret eden referans

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

Java ile Nesneye Yönelik Programlama (Object Oriented Programming)

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

Java String İşlemleri

Programlama Dilleri 3

Final Sınavı Soruları Güz, Süre: 90 Dakika

DÖNGÜLER (LOOPS) while(), do-while(), for(), foreach()

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ

while(), do-while(), for() M.İLKUÇAR 2010 MAKU-MYO

C# Yazım Kuralları ERCİYES. Ü. BİLGİSAYAR M. COMPUTER PROGRAMMING II 1 FEHİM KÖYLÜ

Bölüm 8. Ayrık Küme. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 16

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

BBS515 Nesneye Yönelik Programlama. Ders 2 Zümra Kavafoğlu

Dizi ( Array ) ve Dizgi ( String )

İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 2 DERSİ LAB. ÖDEVİ

VERİ YAPILARI DERS NOTLARI BÖLÜM 5 QUEUE (KUYRUK) Yard. Doç. Dr. Deniz KILINÇ

Java Programlama Dilinde Veri Tipleri. Yrd. Doç. Dr. Aybars UĞUR

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-2 Değişken Kavramı ve Temel Operatörler

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

BAĞLAÇLI LİSTELER LINKED LISTS

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

NESNEYE DAYALI PROGRAMLAMA 11. HAFTA UYGULAMA DERSİ

Programlama Dillerinde Kullanılan Veri Tipleri

Yrd. Doç. Dr. Caner ÖZCAN

JAVADA DİZİ İŞLEMLERİ

Operator Aşırı Yükleme (Operator OverLoading)

KARAR YAPILARI. Acaba hangi yöne gitmeliyim? Oturduğun yerden kalkıp, kapıya varana kadar kaç kez karar verdiniz biliyor musunuz?

Karşılaştırma İşlemleri ve Koşullu İfadeler

Algoritma ve Programlamaya Giriş II JAVA İLE PROGRAMLAMA. Muhammet BAYKARA

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

MAT213 Bilgisayar Programlama I

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

ÖZYİNELEME RECURSION. Yrd. Doç. Dr. Aybars UĞUR

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR

BAĞLAÇLI LİSTELER LINKED LISTS

MAK 1005 Bilgisayar Programlamaya Giriş. Fonksiyonlar. Prof. Dr. Necmettin Kaya

Sınav Dağılım & IMKB Endeks

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

Programlama Dilleri 3

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

C de Detaylı Üs Alma Programı. C# Dilinde Metot Tanımlama ve Yazdırma

Pointer Kavramı. Veri Yapıları

Yrd. Doç. Dr. Caner ÖZCAN

OPERATÖRLER Alıştırmalar

BİLGİSAYAR BİLİMİ DERSİ (KUR 1) PYTHON PROGRAMLAMA DİLİ ÇALIŞMA KÂĞIDI - 1

BİL-142 Bilgisayar Programlama II

J A V A D A P R O G R A M D E N E T İ M İ V E O P E R A T Ö R L E R

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Değişkenler. Geçerli değişken isimleri : baslamazamani, ad_soyad, x5 Geçersiz değişken isimleri : 3x, while

Veri Yapıları ve Algoritmalar dönem

BBS515 Nesneye Yönelik Programlama. Ders 2 Zümra Kavafoğlu

ALGORTMA ve PROGRAMLAMA - II (C# Sürümü) DERS NOTLARI

Akış Konrol Mekanizmaları

JAVADA METOTLAR. BMÜ-111 Algoritma ve Programlama. Yrd. Doç. Dr. İlhan AYDIN

NESNEYE YÖNELİK PROGRAMLAMA C++ a Giriş

BPR152-Algoritma ve Programlama II Uygulama -12

ALGORİTMA VE PROGRAMLAMA II

MAT213 BİLGİSAYAR PROGRAMLAMA I DERSİ Ders 1: Programlamaya Giriş

D İ Z İ L E R A R R A Y S

/*int sayi1, sayi2,toplam=0;

Algoritma Geliştirme ve Veri Yapıları 9 Ağaç Veri Modeli ve Uygulaması. Mustafa Kemal Üniversitesi

Nesne Tabanlı Programlama

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers)

YZM 2105 Nesneye Yönelik Programlama

Arasınav Soruları Bahar 2018

Bölüm 6. Karma. Olcay Taner Yıldız. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, / 31

C# Çalışma Örnekleri

ALGORİTMA VE PROGRAMLAMA I

Yeni bir proje açarken File New - Web Site diyoruz. Gelen ekranda Visual Basic veya C# seçilebilir. Biz ders kapsamında C# programlama dilini seçtik.

Transkript:

YIĞIT STACK Doç. Dr. Aybars UĞUR

Giriş Eleman ekleme çıkarmaların en üstten (top) yapıldığı veri yapısına Yığıt (Stack) adı verilir. Bir eleman ekleneceğinde yığıtın en üstüne konulur. Bir eleman çıkarılacağı zaman yığıtın en üstündeki eleman çıkarılır. Bu eleman da yığıttaki elemanlar içindeki en son eklenen elemandır. Bu nedenle yığıtlara LIFO (Last In First Out : Son giren ilk çıkar) listesi de denilir. YIĞIT 2

Yığıt İşlemleri ve Tanımları (Tanım) Boş yığıt (empty stack) : Elemanı olmayan yığıt. push (yığıta eleman ekleme) : push(s,i), s yığıtının en üstüne i değerini eleman olarak ekler. pop (yığıttan eleman çıkarma) : i = pop(s), s yığıtının en üstündeki elemanı çıkartır ve değerini i değişkenine atar. empty (yığıtın boş olup olmadığını belirleyen işlem) : empty(s), yığıt boş ise TRUE değerini, değilse FALSE değerini döndürür. stacktop (yığıttan çıkarılmaksızın en üstteki elemanın değerini döndüren işlem) Denk işlem : (peek) i = pop(s); push(s,i); (Tanım) Underflow : Boş yığıt üzerinden eleman çıkarılmaya veya yığıtın en üstündeki elemanın değeri belirlenmeye çalışıldığında oluşan geçersiz durum. (Çözümü : pop(s) veya stacktop(s) yapılmadan, empty(s) kontrolü yapılarak, boş bir yığıt olup olmadığı belirlenir. Boş ise bu işlemlerin yapılması engellenir.) YIĞIT 3

Yığıt Kullanımı - I Bir yığıt ve üzerindeki işlemlerin tanımlandığını düşünelim. İç içe parantezler içeren bir ifadede parantezlerin geçerli olması için : 1. Açılan ve kapanan toplam parantez sayısı eşit olmalıdır. Aç ( ve kapa ) parantezlerin eşitliğine bakılır. 2. Kapanan her parantezden önce bir parantez açılmış olmalıdır. Her ) için bir ( olup olmadığına bakılır. ((A+B) ve A+B( 1. şarta uymaz. )A+B(-C ve (A+B))-(C+D 2. şarta uymaz. Problemin çözümü için her açılan parantezde bir geçerlilik alanı açılır ve kapanan parantezde de kapanır. İfadenin herhangi bir noktasındaki Nesting Depth (parantez derinliği) o ana kadar açılmış fakat kapanmamış parantezlerin sayısıdır. İfadenin herhangi bir noktasındaki parantez sayısı = ( sayısı ) sayısı olarak belirtilebilir. Parantezleri geçerli bir ifadede şu şartlar olmalıdır. YIĞIT 4

Yığıt Kullanımı - II 1. İfadenin sonunda parantez sayısı 0 olmalıdır. İfadede ya hiç parantez yoktur veya açılan parantezlerin sayısı ile kapanan parantezlerin sayısı eşittir. 2. İfadenin hiçbir noktasında parantez sayısı negatif olmamalıdır. Bu, parantez açılmadan bir parantezin kapanmadığını garantiler. Aşağıdaki ifade iki şarta da uyar : 7-((x*((x+y)/(j-3))+y)/(4-2.5)) 00122234444334444322211222 2 10 Aşağıdaki ifade 1. şarta uymaz : ((A+B) 122221 (İfade sonunda 1 parantez arttı. 0 değil) Aşağıdaki ifade 2. şarta uymaz : ( A + B ) ) - ( C + D 1 1 1 1 0-1-1 0 0 0 0 (Arada negatif oldu) YIĞIT 5

Yığıt Kullanımı - III Problem biraz değiştirildiğinde : parantezler (parentheses) : (, ) köşeli parantezler (brackets) : [, ] küme parantezleri (braces) : {, } içerebilen ifadelerin parantez doğruluğu kontrolünün yapılması istendiğinde parantez sayılarının yanında tiplerinin de tutulması gerekecektir. Bu nedenle yukarıdaki yöntemin kullanılması uygun olmaz. void main() { printf( Merhaba }; ); yanlış bir ifadedir. YIĞIT 6

Yığıt Kullanımı - IV Karşılaşılan parantezleri tutmak üzere yığıt kullanılabilir (Şekil 5.1). Bir parantezle karşılaşıldığında yığıta eklenir. İlgili parantezlerin karşılığı ile karşılaşıldığında ise yığıta bakılır. Yığıt boş değilse yığıttan bir eleman çıkarılarak doğru karşılık olup olmadığı kontrol edilir. Doğruysa işlem sürdürülür. Değilse ifade geçersizdir. Yığıt sonuna ulaşıldığında yığıt boş olmalıdır. Aksi halde açılmış ama kapanmamış parantez olabilir. İfadelerin parantez geçerliliğinin belirlenmesinde kullanılan yığıt : {x+(y-[a+b])*c-[(d+e)]}/(h-(j-(k-[l-n]))). e e e çç ee ççç e e e e çççç YIĞIT 7

Yığıt Üzerinde Ekleme ve Çıkarma İşlemleri Yığıtın dizi kullanılarak gerçekleştirimi, s yığıtı üzerinde ekleme ve çıkarma işlemleri : s ekle(s,7) çıkar(s) 7 top = 3 6 top = 2 6 6 top = 2 9 9 9 5 5 5 top = 2 nin anlamı yığıtta 3 eleman vardır ve yığıtın en üstündeki eleman [2] dir. Boş yığıtta top = -1 dir. YIĞIT 8

Yığıt Tasarımı ve C# Dilinde Gerçekleştirimi

yığıtın elemanlarını tutan dizi class StackChar { private int maxsize; private char[] stackarray; private int top; C# Dilinde Karakter Yığıtı Sınıfı Oluşturulması public StackChar(int max) { maxsize = max; stackarray = new char[maxsize]; top = -1; } public void push(char j) { stackarray[++top] = j; } public char pop() { return stackarray[top--]; } public bool isempty() { return top == -1; } } 10

Tasarlanan Karakter Yığıtının Kullanımı static void Main(string[] args) { StackChar y = new StackChar(100); string str = "Merhaba"; for(int i=0; i<str.length; ++i) y.push(str[i]); while(!y.isempty()) Console.WriteLine(y.pop()); } Java ya dönüştürmek için sonraki Java kodunu inceleyerek 6 farkı bulunuz! Main -> main string -> String Console.WriteLine -> System.out.println(); str[i] -> str.charat(i) bool -> boolean?.. YIĞIT 11

Java ile Yığıt Tasarımı

JAVA da Karakter Yığıtı import java.io.*; class StackChar { private int maxsize; private char[] stackarray; private int top; public StackChar(int max) { maxsize = max; stackarray = new char[maxsize]; top = -1; } public void push(char j) { stackarray[++top] = j; } public char pop() { return stackarray[top--]; } public boolean isempty() { return top==-1; } } YIĞIT 13

Tasarlanan Karakter Yığıtının Kullanımı class Reverse { public static void main(string args[]) { StackChar y = new StackChar(100); String str = "Merhaba"; for(int i=0; i<str.length(); ++i) y.push(str.charat(i)); while(!y.isempty()) System.out.println(y.pop()); } } YIĞIT 14

Generic (Şablon) Tipte Yığıt Sınıfı YIĞIT 15

Koleksiyonlar içindeki (Hazır) Generic Yığıt Sınıfı using System.Collections.Generic; // string'ler, oluşturulan s yığıtına yerleştirilerek ters sırada listelenmektedir: string[] str = { "Bilgisayar", "Dolap", "Masa", "Sandalye", "Sıra" }; Stack<string> s = new Stack<string>(); for(int i=0; i<str.length;++i) s.push(str[i]); Ekran Çıktısı : Sıra Sandalye Masa Dolap Bilgisayar while(s.count>0) Console.WriteLine(s.Pop()); // string temp = s.pop(); da yapılabilir ekrana yazdırmak yerine! YIĞIT 16

Koleksiyonlar içindeki (Hazır) Generic Olmayan Yığıt Sınıfı using System.Collections; string[] str = { "Bilgisayar", "Dolap", "Masa", "Sandalye", "Sıra" }; Stack s = new Stack(); for(int i=0; i<str.length;++i) s.push(str[i]); string temp; while(s.count>0) temp = s.pop(); // Hata! cannot convert object to string -> Tüm elemanları object tipindedir. Console.WriteLine da hata vermez? 17

Yığıtı Klonlama string[] str = { "Bilgisayar", "Dolap", "Masa", "Sandalye", "Sıra" }; Stack s = new Stack(); for(int i=0; i<str.length;++i) s.push(str[i]); Stack klon = (Stack)s.Clone(); while(s.count>0) Console.WriteLine(s.Pop()); // s yığıtı bitti Console.WriteLine(klon.Pop()); YIĞIT 18

Hazır Stack Sınıfı Metotları http://msdn.microsoft.com/enus/library/1f1xe273.aspx Peek, CopyTo ve ToArray metotlarını deneyebilirsiniz. YIĞIT 19

Java'da hazır Stack (yığıt) sınıfı String'ler, oluşturulan s yığıtına yerleştirilerek ters sırada listelenmektedir: import java.util.*; public class StackTest { public static void main(string args[]) { String str[] = { "Bilgisayar", "Dolap", "Masa", "Sandalye", "Sıra" }; Stack s = new Stack(); for(int i=0; i<str.length;++i) s.push(str[i]); while(!s.empty()) System.out.println(s.pop()); } } YIĞIT 20

C# ile Generic Yığıt Sınıfı Oluşturulması Generic ler, veri işleme algoritmalarının, Veri Tipine özel kodu tekrarlamaksızın yeniden kullanılabilmesini sağlarlar. C++ teki Template lere benzerler, ancak farklılıkları vardır. Generic ler, tip güvenli (type-safe) sınıflar yazmayı sağlarlar. Sınıflarınızı < Tip > parantezleri içerisinde gösterdiğiniz, istediğiniz Tip ile kullanabilirsiniz. YIĞIT 21

C# ile Generic Yığıt Sınıfı Oluşturulması An Introduction to C# Generics ten http://msdn.microsoft.com/en-us/library/ms379564%28v=vs.80%29.aspx public class MyStack<T> { readonly int m_size; int m_stackpointer = 0; T[] m_items; public MyStack() : this(100) { } public MyStack(int size) { m_size = size; m_items = new T[m_Size]; } public void Push(T item) { } if (m_stackpointer >= m_size) throw new StackOverflowException(); m_items[m_stackpointer] = item; m_stackpointer++; public T Pop() { m_stackpointer--; if (m_stackpointer >= 0) { return m_items[m_stackpointer]; } else { m_stackpointer = 0; throw new InvalidOperationException("Cannot pop an empty stack"); } } // Pop method } // class 22

Tasarlanan Generic Yığıt Sınıfının Kullanımı // string Yığıtı olarak kullanımı MyStack<string> ms1 = new MyStack<string>(); ms1.push("masa"); ms1.push("sandalye"); ms1.push("tahta"); string s = ms1.pop(); Console.WriteLine(s); // int Yığıtı olarak kullanımı MyStack<int> ms2 = new MyStack<int>(); ms2.push(5); ms2.push(6); Console.WriteLine(ms2.Pop() + ms2.pop()); // int sayi = ms2.pop(); // Hata verir! Ekran Çıktısı : Tahta 11 YIĞIT 23

Tasarlanan Generic Yığıt Sınıfının Kullanımı public class Ogrenci { public string ad, soyad; public Ogrenci(string adarg, string soyadarg) { ad = adarg; soyad = soyadarg; } } // Ogrenci Yığıtı olarak kullanımı MyStack<Ogrenci> msogr = new MyStack<Ogrenci>(); Ogrenci ogr1 = new Ogrenci("Ali","Yılmaz"); msogr.push(ogr1); msogr.push(new Ogrenci("Veli","Çetin")); Console.WriteLine(msOgr.Pop().soyad); Ekran Çıktısı : Çetin Console.WriteLine(msOgr.Pop().soyad); Yılmaz 24

INFIX, POSTFIX, PREFIX Bu kısımda bilgisayar alanındaki önemli konulardan biri olan infix, postfix ve prefix kavramları üzerinde durulacak ve bu kavramlarda yığıt kullanımı gösterilecektir. A+B operator (işlemci) : + operands (işlenenler) : A, B infix gösterim : A+B prefix gösterim : +AB (benzeri bir gösterim add(a,b) fonksiyonu) postfix gösterim : AB+ in, pre ve post, operator ün operand lara göre yerine karşılık gelir. Infix gösterimde işlemci (+), işlenenlerin (A,B) arasında yer alır. Prefix gösterimde işaretçi, işlenenlerden önce gelir, postfix gösterimde de sonra gelir. YIĞIT 25

Infix ten Postfix e Çevirme A+B*C infix ifadesini postfix e çevirelim. Bunun için işlem önceliğine bakmak gerekir. Çarpmanın toplamaya önceliği olduğu için, A+(B*C) şeklinde düşünülebilir. Önce çarpma kısmı postfix e çevrilecek sonra da sonucu. A+(B*C) anlaşılırlığı artırmak için parantez kullandık. A+(BC*) çarpım çevrildi. A(BC*)+ toplam çevrildi. ABC*+ postfix form. İşlem önceliği (büyükten küçüğe) Üs alma Çarpma/Bölme Toplama/Çıkarma Parantezsiz ve aynı önceliğe sahip işlemcilerde işlemler soldan sağa doğru yapılır (üs alma hariç). Üs almada sağdan sola doğrudur. A-B+C de öncelik (A- B)+C şeklindedir. A^B^C de ise A^(B^C) şeklindedir. Parantezler default öncelikleri belirtmek için konulmuştur. YIĞIT 26

Çevrim Örnekleri Infix Postfix Prefix A+B-C AB+C- -+ABC (A+B)*(C-D) AB+CD-* *+AB-CD A^B*C-D+E/F/(G+H) AB^C*D-EF/GH+/+ +-*ÂBCD//EF+GH ((A+B)*C-(D-E))^(F+G) AB+C*DE FG+^ ^-*+ABC-DE+FG A-B/(C*D^E) ABCDE^*/- -A/B*C^DE Dikkat edilecek olunursa, postfix ile prefix ifadeler birbirinin ayna görüntüsü değildir. YIĞIT 27

Postfix Formun Özellikleri Postfix formda parantez kullanımına gerek yoktur. İki infix ifadeyi düşünün : A+(B*C) ve (A+B)*C. İlk ifadede parantez gereksizdir. İkincide ilk ifade ile karıştırılmaması için gereklidir. Postfix forma çevirmek bu karışıklığı önler. (A+B)*(C+D) yi infix formda parantezsiz ifade etmek için çarpım işlemi yapılırsa işlem sayısı çoğalır. Infix formdan postfix forma çevrilen bir ifadede operand ların (sayı veya sembol) bağlı olduğu operator leri (+,-,*,/) görmek zorlaşır (3 4 5 * + ifadesinin sonucunun 23 e, 3 4 + 5 * ifadesinin sonucunun 35 e karşılık geldiğini bulmak zor gibi görünür). Fakat parantez kullanmadan tek anlama gelen bir hale dönüşür. İşlemleri, hesaplamaları yapmak kolaylaşır. YIĞIT 28

Postfix İfadenin Sonucunun Hesaplanması postfix ifadenin sonucunun hesaplanması (ve bunu gerçekleştiren algoritma): Bir postfix string inde her operator kendinden önce gelen iki operand üzerinde işlem yapacaktır. Bu operandlar daha önceki operator lerin sonuçları da olabilir. Bir anda ifadeden bir operand okunarak yığıta yerleştirilir. Bir operator e ulaşıldığında, yığıtın en üstündeki iki eleman bu operator ün operand ları olacaktır. İki eleman yığıttan çıkarılır işlem yapılır ve sonuç tekrar yığıta konulur. Artık bir sonraki operator ün operand ı olmaya hazırdır. Birçok derleyici 3*2+5*6 gibi bir infix ifadenin değerini hesaplayacağı zaman postfix forma dönüştürdükten (belirsizliği ortadan kaldırdıktan sonra) sonucu hesaplar : 3 2 * 5 6 * + YIĞIT 29

Bir postfix ifadenin 3 2 * 5 6 * + sonucunun hesaplanması Bir operatöre ulaşıldığında, son iki eleman yığıttan çıkarılır, işlem yapılır, sonuç yığıta yerleştirilir: 3 2 * 5 6 * + 6 top 2 top 5 30 top 3 6 top 6 6 36 top YIĞIT 30

Postfix ifadelerin sonucunu hesaplayan algoritma Algoritma : (Bir postfix ifadenin sonucunu hesaplar) opndstk = the empty stack; // scan the input string reading one element at a time into symb while (not end of input) { symb = next input character; if (symb is an operand) push(opndstk,symb); else { // symb is an operator opnd2 = pop(opndstk); opnd1 = pop(opndstk); value = result of applying symb (case *,/,+,-) to opnd1 and opnd2 push(opndstk,value); } // end else } // end while return(pop(opndstk)); Infıx ifadeleri Postfix e çeviren algoritma üzerinde düşününüz! YIĞIT 31

Fonksiyon ve Metot Çağrımları - I Yığıtlar, listelerin ters sırada yazdırılması, palindrom (okunduğunda ve tersten okunduğunda aynı sonucu veren karakter dizisi) benzeri yapıların bulunması, bir ifadedeki parantez gibi sembollerin geçerliliğinin test edilmesi, ifadelerin sonuçlarının hesaplanıp değerlerinin elde edilmesi, infix ifadelerin postfix ifadeye dönüştürülmesi gibi amaçlarla kullanılabildiği gibi, programlama dili derleyicileri (compiler) fonksiyon çağrımlarında da yığıtlardan yararlanırlar. Bir fonksiyon çağrıldığında, çağıran fonksiyonun yerel değişkenleri sistem tarafından kaydedilmelidir; aksi halde çağrılan fonksiyon çağıran fonksiyonun değişkenlerini ve değerlerini ortadan kaldıracaktır. Ayrıca çağıran fonksiyonda kalınan nokta (geri dönüş adresi), çağrılan fonksiyonun bitmesinden sonra geri dönmek üzere tutulmalıdır. YIĞIT 32

Fonksiyon ve Metot Çağrımları - II Soyut olarak bakıldığında, yeni bir fonksiyonun çağrılması ile çağıran fonksiyonun değişkenleri ve geri dönülecek adres bir kağıda kaydedilir ve daha önce çağrılan fonksiyonlara ilişkin bilgilerin tutulduğu kağıtların üzerine konulur. Bundan sonra denetim çağrılan fonksiyona geçer. Kendi değişkenlerine yer açarak onlar üzerinde işlemler yapılmasını sağlar. Fonksiyondan geri dönüleceği zaman en üstteki kağıda bakılıp değişkenler üzerinde ilgili değişiklikler yapılarak geri dönüş adresine atlanır. Derleyici bu işlemleri kağıt yerine yığıt kullanarak gerçekleştirir. YIĞIT 33