logo

Konwertuj notację infiksu na notację przedrostka

Co to jest notacja infiksowa?

Notacja wrostkowa to notacja, w której wyrażenie jest zapisane w zwykłym lub normalnym formacie. Jest to zapis, w którym operatory znajdują się pomiędzy operandami. Przykładami notacji infiksowej są A+B, A*B, A/B itd.

Jak widać w powyższych przykładach, wszystkie operatory występują pomiędzy operandami, są więc notacjami infiksowymi. Dlatego składnię notacji infiksowej można zapisać jako:

Analizowanie wyrażeń Infix

Aby przeanalizować dowolne wyrażenie, musimy zadbać o dwie rzeczy, tj. Pierwszeństwo operatora I Łączność . Pierwszeństwo operatora oznacza pierwszeństwo dowolnego operatora przed innym operatorem. Na przykład:

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

Ponieważ operator mnożenia ma wyższy priorytet niż operator dodawania, dlatego wyrażenie B*C zostanie ocenione jako pierwsze. Wynik mnożenia B * C jest dodawany do A.

Kolejność pierwszeństwa

Operatorzy Symbolika
Nawias { }, ( ), [ ]
Notacja wykładnicza ^
Mnożenie i dzielenie *, /
Dodawanie i odejmowanie +, -

Łączność oznacza, że ​​w wyrażeniu istnieją operatory o tym samym priorytecie. Przykładowo w wyrażeniu A + B - C operatory '+' i '-' mają ten sam priorytet, dlatego są oceniane za pomocą asocjatywności. Ponieważ zarówno „+”, jak i „-” są lewostronnie skojarzone, zostaną one ocenione jako (A + B) - C.

Porządek skojarzeń

Operatorzy Łączność
^ Od prawej do lewej
*, / Od lewej do prawej
+, - Od lewej do prawej

Przyjrzyjmy się skojarzeniom na przykładzie.

pętla Java

1 + 2*3 + 30/5

Ponieważ w powyższym wyrażeniu * i / mają ten sam priorytet, zastosujemy więc regułę skojarzenia. Jak możemy zaobserwować w powyższej tabeli, operatory * i / mają łączność od lewej do prawej, dlatego będziemy skanować od operatora położonego skrajnie po lewej stronie. Operator, który zajmie pierwsze miejsce, zostanie oceniony jako pierwszy. Operator * pojawia się przed operatorem / i mnożenie zostanie wykonane jako pierwsze.

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

1+6+6 = 13

Co to jest notacja przedrostkowa?

Notacja przedrostkowa jest inną formą wyrażenia, ale nie wymaga innych informacji, takich jak pierwszeństwo i powiązanie, podczas gdy notacja wrostkowa wymaga informacji o pierwszeństwie i powiązaniu. Znany jest również jako notacja polska . W notacji przedrostkowej operator występuje przed operandami. Poniżej podano składnię zapisu przedrostkowego:

Na przykład, jeśli wyrażenie wrostkowe ma wartość 5+1, wówczas wyrażenie przedrostkowe odpowiadające temu wyrażeniu wrostkowemu wynosi +51.

dlaczego interfejs znacznika w Javie

Jeśli wyrażenie wrostkowe to:

a * b + c

*ab+c

+*abc (wyrażenie przedrostkowe)

Rozważ inny przykład:

A + B * C

Pierwszy skan: W powyższym wyrażeniu operator mnożenia ma wyższy priorytet niż operator dodawania; zapis przedrostkowy B*C będzie miał postać (*BC).

A + *BC

producent Linuksa

Drugi skan: Podczas drugiego skanowania prefiks będzie wyglądał następująco:

+A *BC

W powyższym wyrażeniu używamy dwóch skanów do konwersji wyrażenia infiksowego na wyrażenie przedrostkowe. Jeśli wyrażenie jest złożone, wówczas potrzebujemy większej liczby skanów. Musimy zastosować tę metodę, która wymaga tylko jednego skanowania i zapewnia pożądany efekt. Jeśli w jednym skanie osiągniemy pożądany wynik, algorytm będzie skuteczny. Jest to możliwe tylko przy użyciu stosu.

Konwersja infiksu na prefiks za pomocą stosu

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

Jeśli konwertujemy wyrażenie z infiksu na przedrostek, musimy najpierw odwrócić wyrażenie.

Wyrażenie odwrotne wyglądałoby następująco:

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

Aby uzyskać wyrażenie przedrostkowe, stworzyliśmy tabelę składającą się z trzech kolumn, tj. wyrażenia wejściowego, stosu i wyrażenia przedrostkowego. Kiedy napotykamy dowolny symbol, po prostu dodajemy go do wyrażenia przedrostkowego. Jeśli spotkamy operatora, wepchniemy go na stos.

Wyrażenie wejściowe Stos Wyrażenie przedrostkowe
Q Q
+ + Q
T + QT
* +* QT
W +* QTV
/ +*/ QTV
W +*/ QTVU
/ +*// QTVU
W +*// 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+-++

Powyższe wyrażenie, tj. QTVUWPO^*//*NM*LK+-++, nie jest wyrażeniem ostatecznym. Musimy odwrócić to wyrażenie, aby uzyskać wyrażenie przedrostkowe.

Reguły konwersji wyrażenia infiksowego na wyrażenie przedrostkowe:

  • Najpierw odwróć wyrażenie wrostkowe podane w zadaniu.
  • Zeskanuj wyrażenie od lewej do prawej.
  • Gdy tylko pojawią się operandy, wydrukuj je.
  • Jeśli operator przybędzie i okaże się, że stos jest pusty, po prostu wepchnij operatora na stos.
  • Jeśli operator przychodzący ma wyższy priorytet niż GÓRA stosu, wepchnij operatora przychodzącego na stos.
  • Jeśli operator przychodzący ma taki sam priorytet z GÓRĄ stosu, wepchnij operatora przychodzącego na stos.
  • Jeśli operator przychodzący ma niższy priorytet niż GÓRA stosu, kliknij i wydrukuj górę stosu. Przetestuj ponownie operator przychodzący na górze stosu i usuń go ze stosu, aż znajdzie operator o niższym lub takim samym priorytecie.
  • Jeśli operator przychodzący ma taki sam priorytet jak szczyt stosu, a operator przychodzący to ^, wówczas przesuwaj wierzchołek stosu, aż warunek zostanie spełniony. Jeśli warunek nie jest spełniony, naciśnij operator ^.
  • Kiedy dojdziemy do końca wyrażenia, wyskocz i wypisz wszystkie operatory z góry stosu.
  • Jeśli operatorem jest „)”, włóż go na stos.
  • Jeśli operatorem jest '(', usuń wszystkie operatory ze stosu, aż znajdzie ) nawias otwierający na stosie.
  • Jeśli szczyt stosu to „)”, wciśnij operatora na stosie.
  • Na koniec odwróć wyjście.

Pseudokod konwersji infiksu na przedrostek

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