Bilgisayarlarda infix yazım türünün çözümlenmesi zordur. Acaba x=a/b−c+d*e−a*c şeklindeki bir ifadeyi çözümlerken, ((4/2)−2)+(3*3)−(4*2) gibi bir ifadenin değerini hesaplarken ya da a/(b−c)+d*(e−a)*c gibi parantezli bir ifadeyi işlerken derleyiciler sorunun üstesinden nasıl geliyor? 32*(55-32-(11-4)+(533-(533-(533+(533-(533+212)))*21-2))) gibi birçok operatör(+, -, /, *, ^) ve operand(A, B, C… gibi isimler ya da sayılar) içeren bir işlemde nasıl operatör önceliklerine göre işlem sıralarını doğru belirleyip sonuç üretebiliyorlar?

Bir ifadede farklı önceliklere sahip operatörler yazılma sırasıyla işlenirse ifade yanlış sonuçlandırılabilir. Örneğin 3+4*2 ifadesi 7*2=14 ile sonuçlandırılabileceği gibi 3+8=11 ile de sonuçlandırılabilir.

Bilgisayarlarda infix yazım türünün çözümlenmesi zordur. Bu yüzden ifadelerin operatör önceliklerine göre ayrıştırılması, ayrılan parçaların sıralanması ve bu sıralamaya uyularak işlem yapılması gerekir. Bu işlemler için prefix ya da postfix notasyonu kullanılır.

Çoğu derleyici, kaynak kod içerisinde infix notasyonunu kullanmaktadır ve daha sonra stack veri yapısını kullanarak prefix veya postfix notasyonuna çevirir.

Infix notasyonu: Alışa geldiğimiz ifadeler infix şeklindedir. Operatörlerin işlenecek operandlar arasına yerleştirildiği gösterim biçimidir. Bu gösterimde operatör önceliklerinin değiştirilebilmesi için parantez kullanılması şarttır. Örneğin infix notasyonundaki 2+4*6 ifadesi 2+24=26 ile sonuçlanır. Aynı ifadede + operatörüne öncelik verilmesi istenirse parantezler kullanılır; (2+4)*6. Böylece ifade 36 ile sonuçlandırılır.

Prefix notasyonu: Prefix notasyonunda (PN, polish notation) operatörler, operandlarından önce yazılır. Örneğin 2+4*6 ifadesi infix notasyonundadır ve prefix notasyonunda +2*46 şeklinde gösterilir.
Benzer biçimde (2+4)*6 ifadesi *+246 şeklinde gösterilir. Görüldüğü gibi prefix notasyonunda işlem önceliklerinin sağlanması için parantezlere ihtiyaç duyulmamaktadır.

Postfix notasyonu: Postfix notasyonunda (RPN, reverse polish notation) ise önce operandlar ve ardından operatör yerleştirilir. Aynı örnek üzerinden devam edersek; infix notasyonundaki 2+4*6 ifadesi prefix notasyonunda 2 4 6 * + şeklinde, benzer biçimde (2+4)*6 ifadesi de 2 4 + 6 * şeklinde gösterilir. Yine prefix’te olduğu gibi bu gösterimde de parantezlere ihtiyaç duyulmamaktadır.

Bazı bilgisayarlar matematiksel ifadeleri postfix olarak daha iyi saklayabilmektedir.

Tüm aritmetik ifadeler bu gösterimlerden birini kullanarak yazılabilir. Ancak, bir yazmaç (register) yığını ile birleştirilmiş postfix gösterimi, aritmetik ifadelerin hesaplanmasında en verimli yoldur.

İşlem önceliği;
1- Parantez içi
2- Üs alma
3- Çarpma/Bölme
4- Toplama Çıkarma
Aynı önceliğe sahip işlemlerde sıra soldan sağa (→) doğrudur. Yalnız üs almada sağdan sola doğru işlem yapılır.

infix-prefix-postfix

Kaynak: Hakan KUTUCU, Veri Yapıları

  1. Cemil Fatih Coşkun diyor ki:

    Merhabalar hocam, yazılarınızı beğendim hele de bu notasyonlar ile yazı oluşturmanızı. Lakin disqus yorum sistemini kullanmanız hem bizim hem sizin için daha yararlı olur.

Cemil Fatih Coşkun için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir