Alg Lengyel Forma
Transcript of Alg Lengyel Forma
a+b ab+ +ab
infix kifejezés
a+b ab+ +ab
postfix kifejezés
a+b a b + +ab
prefix kifejezés
ab+ +ab
prefix kifejezéspostfix kifejezés
Lengyel formaJ. Lukasewitz lengyel matematikus használta először.
(a+b)*(c-d)
postfix kifejezés
infix kifejezés
Példa:
ab+cd-*
ab+cd-*
Előny:A műveleti jelek olyan sorrendben követik egymást, amilyen sorrendben végre kell hajtani azokat.
Lengyelforma
(a+b)*(c-d)
Infix forma
1 3 2 1 2 3
1
a
Előny: infix forma:
A műveleti jel (operátor) közvetlenül az operandusai után áll.
b +
op1 op2 műv
(a+b)*(c-d)
op1
c d -
op1 op2 műv
op2 műv
*
2
Kifejezés lengyel formára hozása:
(1+2)*(3-4) 1 2 + 3 4 - *(1+2)*(3-4)
(a+b*c)*(d*3-4) abc*+d 3*4-*
1( + 2 ) * ( 3 - 4 )x:
y:
s:verem
sorozat
sorozat
Az x sorozatot balról jobbra haladva dolgozzuk fel.A sorozat végét ; jelzi.
1( + 2 ) * ( 3 - 4 )
(
x:
y:
s:
A következő szimbólum nyitózárójel :tegyük a verembe.
verem
( +1 2 ) * ( 3 - 4 )
(
1
x:
y:
s:
A következő szimbólum operandus:írjuk ki.
21( + ) * ( 3 - 4 )
( +
1
x:
y:
s:
A következő szimbólum operátor:1. legfeljebb a nyitózárójelig kivesszük a veremből az operátornál nagyobb prioritású operátorokat és kiírjuk azokat,2. Ezt az operátort betesszük a verembe.
)( +1 2 * ( 3 - 4 )
( +
1 2
x:
y:
s:
A következő szimbólum operandus:írjuk ki.
2 *)( +1 ( 3 - 4 )
(
1 2 +
x:
y:
s:
A következő szimbólum csukózárójel:1. Írjuk ki a verem tetején lévő elemeket egészen a nyitózárójelig.2. Vegyük ki a verem tetejéről a nyitózárójelet.
) (2 *( +1 3 - 4 )
*
1 2 +
x:
y:
s:
A következő szimbólum operátor:1. legfeljebb a nyitózárójelig kivesszük a veremből az operátornál nagyobb prioritású operátorokat és kiírjuk azokat,2. Ezt az operátort betesszük a verembe.
* 3) (2( +1 - 4 )
* (
1 2 +
x:
y:
s:
A következő szimbólum nyitózárójel :tegyük a verembe.
( -* 3)2( +1 4 )
* (
1 2 + 3
x:
y:
s:
A következő szimbólum operandus:írjuk ki.
3 4( -*)2( +1 )
* ( -
1 2 + 3
x:
y:
s:
A következő szimbólum operátor:1. legfeljebb a nyitózárójelig kivesszük a veremből az operátornál nagyobb prioritású operátorokat és kiírjuk azokat,2. Ezt az operátort betesszük a verembe.
- )3 4(*)2( +1
* ( -
1 2 + 3 4
x:
y:
s:
A következő szimbólum operandus:írjuk ki.
4- )3(*)2( +1
* (
1 2 + 3 4 -
x:
y:
s:
A következő szimbólum csukózárójel:1. Irjuk ki a verem tetején lévő elemeket egészen a nyitózárójelig.2. Vegyük ki a verem tetejéről a nyitózárójelet.
)4-3(*)2( +1
*
1 2 + 3 4 - *
x:
y:
s:
Elértük a kifejezés végét:Írjuk ki a veremben lévő összes elemet.
Lengyelforma kiértékelése
-31 2 + 3 4 - *
2
1
1 + 3 4 - *y:
v:verem
sorozat
2
1
1 + 3 4 - *y:
v: verem
A következő szimbólum operandus:Tegyük a verembe.
1 +2
1 2
3 4 - *y:
v: verem
A következő szimbólum operandus:Tegyük a verembe.
2 31 +
3
4 - *y:
v: verem
21
A következő szimbólum operátor:1. Vegyük ki a veremből a második operandust2.Vegyük ki a veremből az első operandust.3. Számítsuk ki az adott műveleti jellel a kifejezés értékét.4. Az így kapott eredményt tegyük a verembe.
3
+ 42 31
3 3
- *y:
v: verem
A következő szimbólum operandus:Tegyük a verembe.
3 -+ 421
3 3 4
*y:
v: verem
A következő szimbólum operandus:Tegyük a verembe.
4 *2 31 + -y:
v: verem
4
3 -1
3 -1
A következő szimbólum operátor:1. Vegyük ki a veremből a második operandust2.Vegyük ki a veremből az első operandust.3. Számítsuk ki az adott műveleti jellel a kifejezés értékét.4. Az így kapott eredményt tegyük a verembe.
-4 *2 31 +y:
v: verem
-1
-3
3 -3
A következő szimbólum operátor:1. Vegyük ki a veremből a második operandust2.Vegyük ki a veremből az első operandust.3. Számítsuk ki az adott műveleti jellel a kifejezés értékét.4. Az így kapott eredményt tegyük a verembe.
*-42 31 +y:
v: verem-3
Az eredmény a verem tetején van.
Elértük a kifejezés végét
Lengyel formára alakítás
• Tegyük fel, hogy az x „token”-ekből álló sor tartalmazza a szintaktikailag helyes kifejezést,
• Egy token lehet: – Operandus, vagy– Operátor (bináris), vagy– ‘(‘, vagy ‘)’
• az y sorba hozzuk létre a postfix formájú kifejezést,
• közben felhasználva az s vermet, mely operátorokat és ‘(‘ –t tartalmazhat
;
not x.IsEmpty
e = operandus?
y.in(e)
e = ‘(‘ e = ‘)‘ e= operátor
y.Empty; s.Empty;
s.push(e)
s.top ≠ ’(’∧prec(s.top) ≥prec(e) ∧¬ s.Is_Empty
y.in(s.pop)
s.top ≠ ‘(‘
y.in(s.pop)
s.push(e)
e←x.out
¬ s.Is_Empty
y.in(s.pop)
s.pop
Lengyel forma kiértékelése
• Tegyük fel, hogy az y sor tartalmazza a postfix alakban lévő kifejezést,
• Értékeljük ki, felhasználva a v vermet, mely operandusokat tartalmazhat
• Az eredményt tároljuk a z változóban
not y.IsEmpty
e = operandus?
v.push(e) op2 ← v.popop1 ← v.popv.push ( ”op1 e op2”)
e←y.out
z ← v.pop
v.Empty; z← 0;