Kas yra infikso žymėjimas?
Infiksinis žymėjimas yra užrašas, kuriame išraiška rašoma įprastu arba normaliu formatu. Tai žymėjimas, kuriame operatoriai yra tarp operandų. Infikso žymėjimo pavyzdžiai yra A+B, A*B, A/B ir kt.
Kaip matome aukščiau pateiktuose pavyzdžiuose, visi operatoriai egzistuoja tarp operandų, taigi jie yra infiksiniai ženklai. Todėl infikso žymėjimo sintaksė gali būti parašyta taip:
Infix išraiškų analizė
Norėdami išanalizuoti bet kurią išraišką, turime pasirūpinti dviem dalykais, t.y. Operatoriaus pirmenybė ir Asociatyvumas . Operatoriaus pirmenybė reiškia bet kurio operatoriaus pirmenybę prieš kitą operatorių. Pavyzdžiui:
A + B * C → A + (B * C)
Kadangi daugybos operatorius turi didesnę pirmenybę prieš sudėjimo operatorių, B * C išraiška bus įvertinta pirmiausia. B * C daugybos rezultatas pridedamas prie A.
python įrašyti json į failą
Pirmumo tvarka
Operatoriai | Simboliai |
---|---|
Skliausteliuose | { }, ( ), [ ] |
Eksponentinis žymėjimas | ^ |
Daugyba ir dalyba | *,/ |
Sudėjimas ir atėmimas | +,- |
Asociatyvumas reiškia, kai reiškinyje yra vienodos pirmenybės operatoriai. Pavyzdžiui, reiškinyje, t.y. A + B - C, operatoriai '+' ir '-' turi tą pačią pirmenybę, todėl jie vertinami asociatyvumo pagalba. Kadangi ir „+“, ir „-“ yra asociatyvūs kairėje, jie būtų vertinami kaip (A + B) – C.
Asociatyvumo tvarka
Operatoriai | Asociatyvumas |
---|---|
^ | Iš dešinės į kairę |
*,/ | Iš kairės į dešinę |
+,- | Iš kairės į dešinę |
Supraskime asociatyvumą per pavyzdį.
1 + 2*3 + 30/5
Kadangi aukščiau pateiktoje išraiškoje * ir / turi tą pačią pirmenybę, taikysime asociatyvumo taisyklę. Kaip matome aukščiau esančioje lentelėje, * ir / operatoriai turi asociatyvumą iš kairės į dešinę, todėl mes nuskaitysime iš kairiojo krašto. Pirmiausia bus įvertintas operatorius, kuris bus pirmas. Operatorius * pasirodo prieš operatorių /, o daugyba bus atlikta pirmiausia.
1+ (2*3) + (30/5)
1+6+6 = 13
Kas yra priešdėlio žymėjimas?
Priešdėlio žymėjimas yra kita išraiškos forma, tačiau jai nereikia kitos informacijos, tokios kaip pirmenybė ir asociatyvumas, o infikso žymėjimui reikalinga pirmumo ir asociatyvumo informacija. Jis taip pat žinomas kaip lenkiškas užrašas . Priešdėlio žymėjime operatorius yra prieš operandus. Priešdėlio žymėjimo sintaksė pateikta žemiau:
Pavyzdžiui, jei infikso išraiška yra 5+1, tai šią infikso išraišką atitinkanti priešdėlio išraiška yra +51.
Jei infikso išraiška yra:
a * b + c
↓
*ab+c
↓
+*abc (priešdėlio išraiška)
Apsvarstykite kitą pavyzdį:
A + B * C
Pirmasis nuskaitymas: Aukščiau pateiktoje išraiškoje daugybos operatorius turi didesnę pirmenybę nei sudėties operatorius; priešdėlio B*C žymėjimas būtų (*BC).
A + *BC
Antrasis nuskaitymas: Antrojo nuskaitymo metu priešdėlis būtų toks:
+A *BC
Aukščiau pateiktoje išraiškoje naudojame du nuskaitymus, kad paverstume infiksą į priešdėlio išraišką. Jei išraiška sudėtinga, mums reikia didesnio nuskaitymų skaičiaus. Turime naudoti tą metodą, kuris reikalauja tik vieno nuskaitymo ir suteikia norimą rezultatą. Jei norimą išvestį pasieksime per vieną nuskaitymą, algoritmas būtų efektyvus. Tai įmanoma tik naudojant krūvą.
„Infix“ konvertavimas į prefiksą naudojant „Stack“.
K + L - M * N + (O^P) * W/U/V * T + Q
Jei konvertuojame išraišką iš infikso į priešdėlį, pirmiausia turime pakeisti išraišką.
Atvirkštinė išraiška būtų tokia:
Q + T * V/U/W * ) P^O(+ N*M - L + K
Norėdami gauti priešdėlio išraišką, sukūrėme lentelę, kurią sudaro trys stulpeliai, ty įvesties išraiška, krūva ir priešdėlio išraiška. Kai susiduriame su bet kokiu simboliu, tiesiog įtraukiame jį į priešdėlio išraišką. Jei susidursime su operatoriumi, įstumsime jį į krūvą.
Įvesties išraiška | Stack | Priešdėlio išraiška |
---|---|---|
K | K | |
+ | + | K |
T | + | QT |
* | +* | QT |
IN | +* | QTV |
/ | +*/ | QTV |
IN | +*/ | QTVU |
/ | +*// | QTVU |
IN | +*// | 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+-++ |
Aukščiau pateikta išraiška, ty QTVUWPO^*//*NM*LK+-++, nėra galutinė išraiška. Turime pakeisti šią išraišką, kad gautume priešdėlio išraišką.
Infikso konvertavimo į priešdėlio išraišką taisyklės:
- Pirmiausia apverskite užduotyje pateiktą infikso išraišką.
- Nuskaitykite išraišką iš kairės į dešinę.
- Kai tik operandai atkeliauja, atspausdinkite juos.
- Jei operatorius atvyksta ir nustatoma, kad krūva tuščia, tiesiog įstumkite operatorių į krūvą.
- Jei gaunamas operatorius turi aukštesnę pirmenybę nei krūvos VIRŠUS, įstumkite įeinantį operatorių į krūvą.
- Jei gaunamas operatorius turi tokią pat pirmenybę kaip krūvos VIRŠUS, įstumkite įeinantį operatorių į krūvą.
- Jei gaunamas operatorius turi mažesnę pirmenybę nei krūvos VIRŠUS, atidarykite ir atspausdinkite krūvos viršų. Dar kartą patikrinkite gaunamą operatorių prieš krūvos viršų ir iškelkite operatorių iš krūvos, kol ji suras žemesnio ar to paties pirmumo operatorių.
- Jei gaunamas operatorius turi tokią pat pirmenybę kaip krūvos viršus, o gaunamas operatorius yra ^, tada stumkite krūvos viršų, kol sąlyga bus teisinga. Jei sąlyga neteisinga, paspauskite operatorių ^.
- Kai pasiekiame išraiškos pabaigą, iššokkite ir išspausdinkite visus operatorius iš krūvos viršaus.
- Jei operatorius yra „)“, įstumkite jį į krūvą.
- Jei operatorius yra „(“, tada iškelkite visus operatorius iš krūvos, kol randa ) atidarymo skliaustelį.
- Jei krūvos viršuje yra „)“, stumkite operatorių ant krūvos.
- Pabaigoje apverskite išvestį.
Infikso konvertavimo į priešdėlį pseudokodas
Function InfixtoPrefix( stack, infix) infix = reverse(infix) loop i = 0 to infix.length if infix[i] is operand → prefix+= infix[i] else if infix[i] is '(' → stack.push(infix[i]) else if infix[i] is ')' → pop and print the values of stack till the symbol ')' is not found else if infix[i] is an operator(+, -, *, /, ^) → if the stack is empty then push infix[i] on the top of the stack. Else → If precedence(infix[i] > precedence(stack.top)) → Push infix[i] on the top of the stack else if(infix[i] == precedence(stack.top) && infix[i] == '^') → Pop and print the top values of the stack till the condition is true → Push infix[i] into the stack else if(infix[i] == precedence(stack.top)) → 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))>