Infix, előtag és a postfix kifejezést - problémamegoldás algoritmusok és adatszerkezetek
Ha a rekord egy aritmetikai kifejezést, mint a B * C, alakja ad elég információt, hogy helyesen értelmezze. Ebben az esetben tudjuk, hogy a B változó megszorozzuk a C változó, mert a szorzás művelet * kifejezése között. Ez a fajta rekord nevű infix. mivel a kezelő között található (a kettő között) a két operandus vele együtt.
Tekintsünk egy másik példát infix: A + B * C operátorok + és * mindig között található az operandusok, de van egy probléma. Pontosan mi operandusok fognak dolgozni? + Együttműködik az A és B vagy B és C kap *? A kifejezés néz egyértelmű.
Nézzük értelmezni nehézségeket okozhat kifejezést az A + B * C-on, operátor elsőbbséget. B és C egymással szorozzák először, akkor az eredmény adunk A. (A + B) * C erőt elvégzésére hozzáadásával előtt az A és B szorzás. Az expressziós A + B + C, az elsőbbségi (via asszociatív) kiszámításra kerül az első bal szélső +.
Bár ez nyilvánvaló, emlékszel: a számítógép szükséges egy pontos ismerete, hogy hogyan és milyen sorrendben szereplők kerülnek kiértékelésre. Az egyik módja, hogy írjon kifejezéseket, biztosítva, hogy nincs káosz alakul tekintetében a műveletek sorrendjét, hogy hozzon létre az úgynevezett kifejeződése egy teljesen elosztott zárójelbe. Ez a fajta véleménynyilvánítás használ egy pár zárójelben az egyes üzemeltetők számára. Konzolok diktálják a műveletek sorrendjét úgy, hogy itt nincs kétértelműség. Mint ahogy nincs szükség megjegyezni a szabályokat a prioritásokat.
Az expressziós A + B * C + D átírható ((A + (B * C)) + D), hogy azt mutatják, hogy a szorzás következik be előbb, majd az elegyhez a szélsőséges bal. A + B + C + D átírása a (((A + B) + C) + D), mert az összeadás művelettel társított balról jobbra.
Van még két nagyon fontos kifejezést formátum, amely első pillantásra úgy tűnhet, mint egy nem nyilvánvaló. Tekintsük infix A + B Mi történne, ha tesszük a szereplő előtt két operandus? A kapott expressziós van + A B Azt is mozgathatja a kezelő, hogy a végén, egyre A B +. Mindez egy kicsit furcsa.
Ezek a változások a helyzet az üzemeltetőt, hogy az operandusok két új formátum - az előtag és postfix. Prefix bejegyzésnél a véleménynyilvánítás megköveteli, hogy az összes piaci szereplő előtt két operandust, akikkel dolgoznak. Postfix, viszont megköveteli, hogy a piaci szereplők arra következő megfelelő operandusok. Néhány további példa segít tisztázni ezt a pontot, (lásd. 2. táblázat).
A + B * C előtagot jelölést úgy lehet újraírni, + A * B C szorzás művelet kerül közvetlenül előtte operandusok B és C, jelezve a prioritás a + *. Majd hozzáadunk üzemeltető előtt, és az eredmény a szorzás.
A postfix jelölési expressziós külleme A B C * +. A műveletek sorrendje ismét menti a * után azonnal a B és C, jelezve, hogy van egy magasabb prioritású következő +. Bár szereplők mozognak, és most található előtt vagy után a mindenkori operandusok sorrendje a múlt egymáshoz képest továbbra is pontosan ugyanaz, mint volt.
2. táblázat: Példák infix, előtagot és postfix jelölést
Konvertálása infix kifejezéseket előtag és postfiksnoe¶
Eddig használt speciális módszerek közötti konverzióra infix kifejezések és azok megfelelői előtag és postfikskoy rekordokat. Amint az várható, vannak módszerek csinál ilyen algoritmikus átalakulások, amelyek lehetővé teszik a megfelelő transzformációs bármilyen kifejezés a komplexitás.
Az első a technikák gondolkodunk, hogy használja az ötlet egy teljes elrendezése zárójelben a kifejezés, azt korábban feltételezték. Emlékezzünk, hogy A + B * C felírható (A + (B * C)), hogy világosan mutatják a prioritását szorzás hozzáadása előtt. Azonban közelebbről megvizsgáljuk, akkor láthatjuk, hogy minden pár zárójelben is jelzi a kezdetét és végét egy pár operandusok a megfelelő szolgáltató a közepén.
Nézd meg a jobb konzol az al-expresszió (B * C) a fenti. Ha áttérünk a szimbólum szorzás a pozícióját, és távolítsa el a megfelelő bal oldali konzolba, akik a B C *, akkor nem lesz konvertáló al-expresszió postfix jelöléssel. Ha a felül üzemben is mozog, hogy a megfelelő jobboldali konzolt, és távolítsa el a kapcsolódó baloldali konzolt, akkor az eredmény az lesz, egy teljesen postfix kifejezés (lásd a. 6. ábra).
6. ábra: Mozgó a jogot üzemeltetők postfix jelöléssel
Ha nem ugyanaz a dolog, de ahelyett, hogy alak mozgását abban a helyzetben, hogy a jobb konzol, csúsztatjuk el balra, megkapjuk az előtag ábrázolás (lásd. 7. ábra). Pozíció zárójelben pár valóban a legfontosabb, hogy a végleges álláspontját az üzemeltető között kötött velük.
7. ábra: mozgassa az üzemeltetők elhagyta a előtagot.
Így, amikor konvertáló expresszió (nem számít, hogy mennyire összetett) egy előtag vagy postfix jelölést beállítására műveletek sorrendjét a teljes összehangolás zárójelben. Aztán belül az üzemeltető mozgatja őket, hogy a szélsőséges bal vagy a jobb szélső helyzetbe - attól függően, hogy az előtag vagy postfix jelölést szeretne kapni.
Itt van egy bonyolultabb kifejezést: (A + B) * C - (D - E) * (F + G). A 8. ábra annak átalakulását postfix és az előtag faj.
8. ábra: átalakítása egy komplex expressziós előtagot és postfix jelöléssel.
Általános konverzió infix a postfix vid¶
Ki kell fejleszteni egy olyan algoritmust átalakításához bármely infix kifejezést postfix. Ehhez hogy egy közelebbi pillantást a nagyon átalakítás.
Tekintsük ismét a kifejezést A + B * C Mint a fentiekből kiderül, a postfix ekvivalens A B C * +. Már jeleztük, hogy az operandusok A, B és C a helyükön maradnak, és változtatni a helyét az egyetlen szereplők. Ismét, nézd meg a szolgáltatók a infix kifejezés. Először, amikor elhaladnak balról jobbra, akkor csökkenni fog. + Azonban, a postfix expressziós + ez a végén, mint a következő operátor, *, elsőbbséget élvez mellett. Az, hogy a piaci szereplők az eredeti feltételei inverze kapott postfix kifejezést.
A feldolgozás során a kifejezés operátorok kell tárolni valahol, amíg megtalálták a megfelelő jobb oldali operandus. Továbbá, a sorrendben ezek konzervált szereplők lehet fordítani (mert a prioritás), mint a példában az összeadás és a szorzás. Mivel az adagolás üzemeltető előtt megjelenő szorzás művelet alacsonyabb a prioritása, ennek meg kell jelennie az utolsó használat. Emiatt fordított sorrendben van értelme, hogy a használata egy köteg tárolási nyilatkozatok, ameddig szükség van rájuk.
Mi a helyzet a (A + B) * C? Emlékezzünk postfix azzal egyenértékű: A B + C *. Ismét a feldolgozás a infix kifejezést balról jobbra, az első találkozunk. + Ebben az esetben, amikor látni fogjuk, * + akkor már lehet helyezni a kapott kifejezés, mert van egy előnye az erő alkalmazása * zárójelben. Most már jár, hogy megvizsgálja a dolgozó konverziós algoritmus. Amikor azt látjuk, a bal konzol, akkor tároljuk annak jeléül, hogy ő jött volna egy másik üzemben kiemelten kezeli. Ő fog várni, amíg a megfelelő jobb oldali zárójel jelenik jelölni a helyét (emlékszik a technika teljes elrendezését zárójelben). Megjelenése után a jobb oldali zárójel operátor tolni a verem.
Ahogy olvasni a infix kifejezést balról jobbra, majd fogjuk használni a verem tárolja szereplők. Ez biztosítja számunkra a fordított sorrendben, mely elnyerte az első példa. A tetején a verem mindig az utoljára mentett az üzemeltető. Amikor olvasunk egy új szolgáltató, mi kell összehasonlítani kiemelt operátorokkal a verem (ha van ilyen).
Tegyük fel, hogy a közti tag kifejezés egy sor zsetonok, szóközzel elválasztva. tokenek szereplők *, /, +, és - együtt a jobb és bal konzolok (és). Token operandusok - egy egybetűs azonosítók A, B, C, és így tovább. A következő lépések adja meg a token string postfix érdekében.
- Hozzon létre egy üres verem úgynevezett opstack tárolóüzemeltetőket. Hozzon létre egy üres lista kimenet.
- Átalakítás infix string egy listát, a húr módszer osztott.
- Scan listáját tokenek balról jobbra.
- Ha a token egy operandus, akkor add hozzá a végén a kimeneti lista.
- Ha a token egy baloldali zárójel, betette opstack.
- Ha a token egy jobb zárójel, majd nyomja elemek opstack, amíg a megfelelő baloldali zárójel található. Minden üzemben adunk a végén a kimeneti lista.
- Ha a token egy olyan üzemben *, /, + vagy - tedd opstack. Mielőtt azonban ez nyomja a gazdasági szereplők bármelyike már opstack. Ha ez nagyobb, vagy egyenlő, mint prioritás, és add meg a találati listában.
#. Ha a bemeneti kifejezés lesz teljesen feldolgozott, ellenőrizze opstack. Bármilyen szereplők még mindig benne van, meg kell nyomni, és add, hogy a végén a végleges lista.
A 9. ábra a konverziós algoritmus dolgozik a kifejezés egy * B + C * D. Vegye figyelembe, hogy az első A üzemeltető * távolítani, mielőtt találkozunk a + operátor. + Továbbra is a verem, amikor egy második *, mert a szorzás elsőbbséget élvez kívül. Végén infix expressziójának kettős stack ejekciós előfordul, eltávolítása az üzemeltetők és üzembe +, mint az utolsó eleme a kapott postfix kifejezést.
9. ábra: átalakítása A * B + C * D postfix jelöléssel
Kódolni egy algoritmus Python, akkor használja a szótárban néven prec tárolni az értékeket kezelő elsőbbséget. Ez kötődik mindegyik üzemeltetőnek, hogy egy egész szám, amely össze lehet hasonlítani a számok más szolgáltatók, mint a prioritási szint (az általunk önkényesen kiválasztott egész szám 3, 2 és 1). A bal oldali konzol kapja a legalacsonyabb érték. Így minden szereplő összehasonlítani, hogy lesz egy magasabb prioritású helyezik át. 15. sor határozza meg, hogy az operandusok lehet bármely nagybetűs vagy számok. Teljes konverziót látható funkció ActiveCode 8.
Fuss mentése Load Show Codelens
postfix vychisleniya¶
Az utolsó példában nézzük meg a köteget kifejezést használja, ami már a postfix forma. Ebben az esetben a szerkezet a probléma megoldására újonnan kiválasztott verem. Azonban, mivel olvas be postfix kifejezés, várakoznak már operandusok és nem a szolgáltatók, szemben a fenti algoritmus. Egy másik módja, hogy gondolni ezt a döntést: ha a bemenet megtalálható az üzemeltető kiszámításához két utolsó operandus fogja használni.
Ahhoz, hogy megértsük ezt részletesebben, úgy a postfix kifejezést 4 5 6 +. Letapogatással balról jobbra, először lesz találkozás operandusok 4. és 5. Mi a teendő velük nem ismert, még nem ismert, a következő karaktert. Elhelyezés minden verem, hogy azok az esetre, ha a következő kijelentés.
Ebben az esetben a következő karakter - egy másik operandust. Tehát, mint korábban, tedd a verem, és ellenőrizze a következő karaktert. Látjuk a * operátor, ami azt jelenti, a szorzás a legutóbbi két operandus. Azáltal, hogy a kiesés a verem kétszer, megkapjuk a szükséges szorzókat, majd hajtsa végre a szorzás (ebben az esetben az eredmény nem lesz 30).
A 11. ábra a valamivel bonyolultabb példa 7 8 + 3 2 + /. Két pont, hogy érdemes megjegyezni. Először is, a verem mérete növekszik, csökken és növekszik újra a folyamat értékelése illeszkedik. Másodszor: feldolgozási osztás legyen nagyon óvatos. Emlékezzünk vissza, hogy a postfix kifejezést operandusok az eredeti sorrendben, mert a postfix csak megváltoztatja a pozícióját az üzemeltető. Ha elosztjuk az operandust tolta ki a verem, akkor fordított sorrendben. Mivel a szétválás nem kommutatív operátor (más szóval, \ (15/5 \) nem ugyanaz, mint a \ (15/05 \)), meg kell bizonyosodni arról, hogy a sorrendben az operandusok nem változik.
11. ábra: egy összetettebb példáját kiszámításának
Tegyük fel, hogy a postfix kifejezést - egy string tokenek, szóközzel elválasztva. Az üzemeltetők *, /, +, és -, valamint egy egybites operandus utal az egész ügyet. A kimenet lehet egy egész szám eredménye.
- Hozzon létre egy üres verem úgynevezett operandStack.
- Átalakítani a karakterláncot a listához, a húr módszer osztott.
- Scan listáját tokenek balról jobbra.
- Ha a token egy operandus, majd átalakítani, egy karakterláncot egy egész értéket, és tegye a operandStack.
- Ha a token egy olyan üzemben *, /, + vagy -, akkor szüksége van két operandus. Gyártunk kilökődését operandStack kétszer. Először vegye ki a második operandust, majd - az első. Mi aritmetikai műveletek végrehajtását, és elhelyezi az eredményt vissza operandStack.
- Ha a bemeneti kifejezés teljesen feldolgozott, az eredmény a verem. OperandStack tolja ki és vissza, mint a válasz.
Teljesen funkció kiszámításának postfix kifejezést látható ActiveCode 9. Ahhoz, hogy segítse a számtani definiált segédfunkció doMath. Tart két operandus és az üzemben, majd végrehajtja a megfelelő számtani művelet.
Fuss mentése Load Show Codelens