logo

Infix'i önek gösterimine dönüştürün

Infix notasyonu nedir?

Bir ek gösterimi, bir ifadenin olağan veya normal formatta yazıldığı bir gösterimdir. Operatörlerin işlenenler arasında yer aldığı bir gösterimdir. İç ek gösterimi örnekleri A+B, A*B, A/B vb.'dir.

Yukarıdaki örneklerde görebileceğimiz gibi, tüm operatörler işlenenler arasında yer alır, dolayısıyla bunlar ek gösterimlerdir. Bu nedenle, ek gösteriminin sözdizimi şu şekilde yazılabilir:

liste düğümü

Infix ifadelerini ayrıştırma

Herhangi bir ifadeyi ayrıştırmak için iki şeye dikkat etmemiz gerekir; Operatör Önceliği Ve çağrışımsallık . Operatör önceliği, herhangi bir operatörün diğer operatöre göre önceliği anlamına gelir. Örneğin:

A + B * C → A + (B * C)

Çarpma operatörü toplama operatörüne göre daha yüksek önceliğe sahip olduğundan ilk olarak B*C ifadesi değerlendirilecektir. B*C çarpımının sonucu A'ya eklenir.

Öncelik sırası

Operatörler Semboller
Parantez { }, ( ), [ ]
Üstel gösterim ^
Çarpma ve bölme *, /
Toplama ve çıkarma +, -

İlişkisellik, ifadede aynı önceliğe sahip operatörlerin mevcut olması anlamına gelir. Örneğin A + B - C ifadesinde '+' ve '-' operatörleri aynı önceliğe sahip olduğundan çağrışımsallık yardımıyla değerlendirilirler. Hem '+' hem de '-' sol çağrışımlı olduğundan (A + B) - C olarak değerlendirilecektir.

İlişkisellik sırası

Operatörler çağrışımsallık
^ Sağdan sola
*, / Soldan sağa
+, - Soldan sağa

Bir örnek üzerinden çağrışımsallığı anlayalım.

1 + 2*3 + 30/5

Yukarıdaki ifadede * ve / aynı önceliğe sahip olduğundan çağrışım kuralını uygulayacağız. Yukarıdaki tabloda görebildiğimiz gibi * ve / operatörleri soldan sağa ilişkiselliğe sahiptir, dolayısıyla en soldaki operatörden tarama yapacağız. İlk gelen operatör ilk olarak değerlendirilecektir. * operatörü / operatöründen önce gelir ve önce çarpma işlemi yapılır.

1+ (2*3) + (30/5)

1+6+6 = 13

Önek gösterimi nedir?

Bir önek gösterimi başka bir ifade biçimidir ancak öncelik ve ilişkilendirilebilirlik gibi başka bilgiler gerektirmez, oysa bir ek gösterimi öncelik ve ilişkilendirilebilirlik bilgisi gerektirir. Aynı zamanda şu şekilde de bilinir: cila gösterimi . Önek gösteriminde, işlenenlerden önce bir operatör gelir. Önek gösteriminin sözdizimi aşağıda verilmiştir:

Örneğin, infix ifadesi 5+1 ise bu infix ifadesine karşılık gelen önek ifadesi +51 olur.

bahar önyükleme mimarisi

Eğer ek ifadesi şöyle ise:

a * b + c

*ab+c

+*abc (Önek ifadesi)

Başka bir örnek düşünün:

A + B * C

İlk tarama: Yukarıdaki ifadede çarpma operatörü, toplama operatöründen daha yüksek önceliğe sahiptir; B*C'nin önek gösterimi (*BC) olacaktır.

A + *BC

Java döngüleri

İkinci tarama: İkinci taramada önek şöyle olacaktır:

+A *MÖ

Yukarıdaki ifadede, infix'i önek ifadesine dönüştürmek için iki tarama kullanıyoruz. İfade karmaşıksa, daha fazla sayıda taramaya ihtiyacımız var. Tek tarama gerektiren ve istenilen sonucu veren yöntemi kullanmamız gerekiyor. İstenilen çıktıyı tek bir taramayla elde edersek algoritma verimli olacaktır. Bu ancak yığın kullanılarak mümkündür.

Stack kullanarak Infix'in Prefix'e dönüştürülmesi

K + L - M * N + (O^P) * W/U/V * T + Q

İfadeyi infix'ten önek'e dönüştürüyorsak, önce ifadeyi tersine çevirmemiz gerekir.

Ters ifade şu şekilde olacaktır:

Q + T * V/U/W * ) P^O(+ N*M - L + K

Önek ifadesini elde etmek için üç sütundan (giriş ifadesi, yığın ve önek ifadesi) oluşan bir tablo oluşturduk. Herhangi bir sembolle karşılaştığımızda onu önek ifadesine eklememiz yeterlidir. Operatörle karşılaşırsak onu yığının içine iteceğiz.

Giriş ifadesi Yığın Önek ifadesi
Q Q
+ + Q
T + QT
* +* QT
İÇİNDE +* QTV
/ +*/ QTV
İÇİNDE +*/ QTVU
/ +*// QTVU
İÇİNDE +*// QTVUW
* +*//* QTVUW
) +*//*) QTVUW
P +*//*) QTVUWP
^ +*//*)^ QTVUWP
Ö +*//*)^ QTVUWPO
( +*//* QTVUWPO^
+ ++ QTVUWPO^*//*
N ++ QTVUWPO^*//*N
* +* QTVUWPO^*//*N
M +* QTVUWPO^*//*NM
- ++- QTVUWPO^*//*NM*
L ++- QTVUWPO^*//*NM*L
+ +-+ QTVUWPO^*//*NM*L
k +-+ QTVUWPO^*//*NM*LK
QTVUWPO^*//*NM*LK+-++

Yukarıdaki ifade, yani QTVUWPO^*//*NM*LK+-++, son bir ifade değildir. Önek ifadesini elde etmek için bu ifadeyi ters çevirmemiz gerekir.

Infix'in önek ifadesine dönüştürülmesine ilişkin kurallar:

  • Öncelikle problemde verilen ek ifadesini ters çevirin.
  • İfadeyi soldan sağa tarayın.
  • İşlenenler geldiğinde onları yazdırın.
  • Operatör geldiğinde ve yığının boş olduğu tespit edilirse, operatörü yığının içine itmeniz yeterlidir.
  • Gelen operatörün yığının TOP'undan daha yüksek önceliği varsa, gelen operatörü yığının içine itin.
  • Gelen operatör yığının TOP'u ile aynı önceliğe sahipse, gelen operatörü yığının içine itin.
  • Gelen operatörün yığının TOP kısmından daha düşük önceliği varsa, açılır ve yığının üst kısmını yazdırır. Gelen operatörü yığının tepesine doğru tekrar test edin ve daha düşük önceliğe veya aynı önceliğe sahip operatörü bulana kadar operatörü yığından çıkarın.
  • Gelen operatör yığının tepesiyle aynı önceliğe sahipse ve gelen operatör ^ ise, koşul doğru olana kadar yığının üst kısmını açın. Koşul doğru değilse ^ operatörüne basın.
  • İfadenin sonuna ulaştığımızda, pop'u açın ve tüm operatörleri yığının en üstünden yazdırın.
  • Operatör ')' ise yığının içine itin.
  • Operatör '(' ise, yığındaki açılış parantezini bulana kadar tüm operatörleri yığından çıkarın.
  • Yığının üst kısmı ')' ise, operatörü yığının üzerine itin.
  • Sonunda çıkışı tersine çevirin.

Infix'in sözde kodunu önek dönüşümüne dönüştürme

alt dize işlevi Java
 Function InfixtoPrefix( stack, infix) infix = reverse(infix) loop i = 0 to infix.length if infix[i] is operand &#x2192; prefix+= infix[i] else if infix[i] is &apos;(&apos; &#x2192; stack.push(infix[i]) else if infix[i] is &apos;)&apos; &#x2192; pop and print the values of stack till the symbol &apos;)&apos; is not found else if infix[i] is an operator(+, -, *, /, ^) &#x2192; if the stack is empty then push infix[i] on the top of the stack. Else &#x2192; If precedence(infix[i] &gt; precedence(stack.top)) &#x2192; Push infix[i] on the top of the stack else if(infix[i] == precedence(stack.top) &amp;&amp; infix[i] == &apos;^&apos;) &#x2192; Pop and print the top values of the stack till the condition is true &#x2192; Push infix[i] into the stack else if(infix[i] == precedence(stack.top)) &#x2192; Push infix[i] on to the stack Else if(infix[i] <precedence(stack.top)) → pop the stack values and print them till is not empty infix[i] < precedence(stack.top) push on to end loop remaining elements of prefix="reverse(prefix)" return pre> <hr></precedence(stack.top))>