logo

Infix konvertálása előtag jelöléssé

Mi az infix jelölés?

Az infix jelölés olyan jelölés, amelyben egy kifejezést szokásos vagy normál formátumban írnak. Ez egy olyan jelölés, amelyben az operátorok az operandusok között helyezkednek el. Az infix jelölés példái az A+B, A*B, A/B stb.

Ahogy a fenti példákban is láthatjuk, az összes operátor létezik az operandusok között, tehát infix jelölések. Ezért az infix jelölés szintaxisa a következőképpen írható fel:

Java hivatkozási típusok

Infix kifejezések elemzése

Bármely kifejezés elemzéséhez két dologra kell ügyelnünk, pl. Üzemeltetői elsőbbség és Az asszociativitás . Az operátor elsőbbsége bármely operátor elsőbbségét jelenti egy másik operátorral szemben. Például:

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

Mivel a szorzó operátornak nagyobb a prioritása az összeadás operátorral szemben, így a B * C kifejezést először a rendszer értékeli ki. A B * C szorzatának eredményét hozzáadjuk az A-hoz.

Elsőbbségi sorrend

Üzemeltetők Szimbólumok
Zárójel { }, ( ), [ ]
Exponenciális jelölés ^
Szorzás és osztás *, /
Összeadás és kivonás +, -

Az asszociativitás azt jelenti, hogy az azonos prioritású operátorok szerepelnek a kifejezésben. Például az A + B - C kifejezésben a '+' és '-' operátorok azonos elsőbbséget élveznek, tehát az asszociativitás segítségével kerülnek kiértékelésre. Mivel mind a '+', mind a '-' balra asszociatív, ezért (A + B) - C-ként lesznek kiértékelve.

Az asszociativitás sorrendje

Üzemeltetők Az asszociativitás
^ Jobbról balra
*, / Balról jobbra
+, - Balról jobbra

Értsük meg az asszociativitást egy példán keresztül.

1 + 2*3 + 30/5

Mivel a fenti kifejezésben a * és / ugyanazt az elsőbbséget élvezi, ezért az asszociativitási szabályt alkalmazzuk. Ahogy a fenti táblázatban láthatjuk, hogy a * és / operátorok balról jobbra asszociativitással rendelkeznek, ezért a bal szélső operátorból fogunk szkennelni. Az elsőként érkező operátor kerül először értékelésre. A * operátor a / operátor előtt jelenik meg, és először a szorzás történik.

i d e teljes formája

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

1+6+6 = 13

Mi az előtag jelölése?

Az előtag jelölés egy másik kifejezési forma, de nem igényel más információt, például elsőbbséget és asszociativitást, míg az infix jelöléshez elsőbbségi és asszociativitási információra van szükség. Úgy is ismert, mint lengyel jelölés . Az előtag jelölésénél egy operátor kerül az operandusok elé. Az előtag jelölésének szintaxisa az alábbiakban látható:

Például, ha az infix kifejezés 5+1, akkor ennek az infix kifejezésnek megfelelő prefix kifejezés +51.

Ha az infix kifejezés:

a * b + c

kali linux parancsokat

*ab+c

+*abc (előtag kifejezés)

Vegyünk egy másik példát:

A+B*C

Első szkennelés: A fenti kifejezésben a szorzási operátor magasabb prioritású, mint az összeadás operátor; a B*C előtag jelölése (*BC) lenne.

A + *BC

Második szkennelés: A második vizsgálatban az előtag a következő lenne:

+A *Kr.e

A fenti kifejezésben két vizsgálatot használunk az infix előtag kifejezéssé konvertálására. Ha a kifejezés összetett, akkor nagyobb számú vizsgálatra van szükség. Azt a módszert kell használnunk, amely csak egy vizsgálatot igényel, és biztosítja a kívánt eredményt. Ha egy letapogatással elérjük a kívánt kimenetet, akkor az algoritmus hatékony lenne. Ez csak stack használatával lehetséges.

ipconfig az Ubuntun

Az Infix átalakítása előtaggá a verem segítségével

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

Ha a kifejezést infixről előtagra konvertáljuk, először meg kell fordítanunk a kifejezést.

A fordított kifejezés a következő lenne:

java szinkronizálás

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

Az előtag kifejezés megszerzéséhez létrehoztunk egy táblázatot, amely három oszlopból áll, azaz a bemeneti kifejezésből, a veremből és az előtag kifejezésből. Ha bármilyen szimbólummal találkozunk, egyszerűen hozzáadjuk az előtag kifejezéshez. Ha találkozunk az operátorral, betoljuk a verembe.

Bemeneti kifejezés Kazal Előtag kifejezés
K K
+ + K
T + QT
* +* QT
BAN BEN +* QTV
/ +*/ QTV
BAN BEN +*/ QTVU
/ +*// QTVU
BAN BEN +*// QTVUW
* +*//* QTVUW
) +*//*) QTVUW
P +*//*) QTVUWP
^ +*//*)^ QTVUWP
O +*//*)^ 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+-++

A fenti kifejezés, azaz a QTVUWPO^*//*NM*LK+-++ nem végleges kifejezés. Meg kell fordítanunk ezt a kifejezést, hogy megkapjuk az előtag kifejezést.

Az infix előtag kifejezéssé konvertálásának szabályai:

  • Először fordítsa meg a feladatban megadott infix kifejezést.
  • Olvassa be a kifejezést balról jobbra.
  • Amikor megérkeznek az operandusok, nyomtassa ki őket.
  • Ha a kezelő megérkezik, és a verem üresnek tűnik, egyszerűen nyomja be a kezelőt a verembe.
  • Ha a bejövő operátor prioritása magasabb, mint a verem TOP-ja, tolja be a bejövő operátort a verembe.
  • Ha a bejövő operátornak ugyanolyan elsőbbsége van a verem TOP-jával, tolja be a bejövő operátort a verembe.
  • Ha a bejövő operátor prioritása alacsonyabb, mint a verem TETE, nyissa ki és nyomtassa ki a verem tetejét. Tesztelje újra a bejövő operátort a verem tetején, és emelje ki az operátort a veremből, amíg meg nem találja az alacsonyabb vagy azonos prioritású operátort.
  • Ha a bejövő operátor elsőbbsége megegyezik a verem tetejével, és a bejövő operátor ^, akkor nyissa ki a verem tetejét, amíg a feltétel igaz lesz. Ha a feltétel nem igaz, nyomja meg a ^ operátort.
  • Amikor elérjük a kifejezés végét, nyissa ki és nyomtassa ki az összes operátort a verem tetejéről.
  • Ha az operátor ')', akkor tolja be a verembe.
  • Ha az operátor '(', akkor az összes operátort a veremből, amíg meg nem találja) nyitó zárójelet a veremben.
  • Ha a verem teteje ')', nyomja a kezelőt a veremre.
  • A végén fordítsa meg a kimenetet.

Az infix-előtag átalakítás pszeudokódja

 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))>