infix kifejezés a+b ab+ +ab Készítette: Szabóné Nacsa Rozália nacsa@inf.elte.hu postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab 4
Lengyelforma J. Lukasewitz lengyel matematikus használta el ször. Példa: infix kifejezés a+bc-d ab+ +ab postfix kifejezés ab+cd- postfix kifejezés prefix kifejezés 5 6 El n A m veleti jelek olyan sorrendben követik egymást, amilyen sorrendben végre kell hajtani azokat. El n A m veleti jel operátor közvetlenül az operandusok után áll. infix forma: a+bc-d Infix forma a+bc-d Lengyelforma ab+cd- a b + op op m v c d - op op m v op op m v 7 8
Feladat: A standard bemeneten megadott, pontosveszz vel lezárt, szintaktikusan helyes, infix aritmetikai kifejezést alakítsunk át postfix kifejezésre lengyelformára. Példa: +-4 + 4 - sorozat sorozat verem + - 4 Az Az átalakításhoz két két sorozatot, és és egy vermet használunk. 9 0 sorozat sorozat verem + - 4 + - 4 verem Az x sorozatot balról jobbra haladva dolgozzuk fel. A sorozat végét ; jelzi. A következ szimbólum nyitózárójel. Tegyük a verembe!
+ - 4 + - 4 A következ szimbólum operandus. Írjuk ki! ki! A következ szimbólum operátor... Legfeljebb a nyitózárójelig kivesszük a veremb l l az az operátornál kisebb prioritású operátorokat és és kiírjuk azokat, 4 + - 4 + - 4 + + A következ szimbólum operátor... Legfeljebb a nyitózárójelig kivesszük a veremb l l az az operátornál kisebb prioritású operátorokat, és és kiírjuk azokat, majd majd.. ezt ezt az az operátort betesszük a verembe. A következ szimbólum operandus. Írjuk ki! 5 6 4
+ - 4 + - 4 + + + A következ szimbólum csukózárójel... Írjuk Írjuk ki ki a verem tetején lév lév elemeket egészen a nyitózárójelig,.... A következ szimbólum csukózárójel:. Írjuk ki a verem tetején lév elemeket egészen a nyitózárójelig, majd. vegyük ki a verem tetejér l a nyitózárójelet. 7 8 + - 4 + - 4 + + A következ szimbólum operátor:. Legfeljebb a nyitózárójelig kivesszük a veremb l az operandusnál kisebb prioritású operandusokat, és kiírjuk azokat,... 9 A következ szimbólum operátor:. Legfeljebb a nyitózárójelig kivesszük a veremb l az operandusnál kisebb prioritású operandusokat, és kiírjuk azokat, majd. Ezt az operandust betesszük a verembe. 0 5
+ - 4 + - 4 + + A következ szimbólum nyitózárójel. Tegyük a verembe! A következ szimbólum operandus. Írjuk ki! + - 4 + - 4 + + - A következ szimbólum operátor.. Legfeljebb a nyitózárójelig kivesszük a veremb l az operátornál kisebb prioritású operátorokat, és kiírjuk azokat,... A következ szimbólum operátor:. Legfeljebb a nyitózárójelig kivesszük a veremb l az operátornál kisebb prioritású operátorokat, és kiírjuk azokat, majd. ezt az operátort betesszük a verembe. 4 6
+ - 4 + - 4 + 4 + 4 - - - A következ szimbólum operandus. Írjuk ki! A következ szimbólum csukózáróje.. Írjuk ki a verem tetején lév elemeket egészen a nyitózárójelig,... 5 6 + - 4 + - 4 ; + 4 - + 4 - A következ szimbólum csukózárójel:. Írjuk ki a verem tetején lév elemeket egészen a nyitózárójelig, majd. vegyük ki a verem tetejér l a nyitózárójelet. Elértük a kifejezés végét. Írjuk ki a veremben lév összes elemet. 7 8 7
Feladat: Határozzuk meg egy sorozatban elhelyezett, postfix lengyelformára hozott kifejezs értékét. + 4 - + 4 - példa - A szimbólum operandus. Tegyük a verembe! 9 0 + 4 - + 4 - A következ szimbólum operandus. Tegyük a verembe! A következ szimbólum operator.. Vegyük ki a veremb l a második operandust,... 8
+ 4 - + 4 - A következ szimbólum operator:. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust,... A következ szimbólum operator:. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust, majd. Számítsuk ki az adott m veleti jellel a kifejezés értékét,... 4 + 4 - + 4 - A következ szimbólum operator:. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust, majd. számítsuk ki az adott m veleti jellel a kifejezés értékét, majd 4. az így kapott eredményt tegyük a verembe. A következ szimbólum operandus. Tegyük a verembe! 5 6 9
+ 4 - + 4-4 4 4 A következ szimbólum operandus. Tegyük a verembe! A következ szimbólum operator.. Vegyük ki a veremb l a második operandust,... 7 8 + 4 - + 4-4 4 - A következ szimbólum operator.. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust,... A következ szimbólum operator.. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust, majd. számítsuk ki az adott m veleti jellel a kifejezés értékét,... 9 40 0
+ 4 - + 4-4 - - - A következ szimbólum operator.. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust, majd. számítsuk ki az adott m veleti jellel a kifejezés értékét, majd 4. az így kapott eredményt tegyük a verembe. A következ szimbólum operator.. Vegyük ki a veremb l a második operandust,... 4 4 + 4 - + 4 - - - - A következ szimbólum operator:. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust,... A következ szimbólum operator:. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust, majd. számítsuk ki az adott m veleti jellel a kifejezés értékét,... 4 44
+ 4 - + 4 - ; - - Elértük a kifejezés végét - - A következ szimbólum operator.. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust, majd. számítsuk ki az adott m veleti jellel a kifejezés értékét, majd 4. az így kapott eredményt tegyük a verembe. Az eredmény a verem tetején van. 45 46 Kifejezés lengyelformára hozása Lengyelforma kiértékelése sx,dx,read; =0; creates; pushs,dx hiextdx sx = norm dx = operandus x = x = x = operator tops tops prectops precdx is_emptys hiextpops hiextpops sy,dy,read; z:=0; createv; sy = norm pushv,dy dy = operandus op = popv op = popv push v, op dy op sx,dx,read is_emptys hiextpops pops pushs,dx 47 sy,dy,read z:hiextpopv 48
sorozat sorozat verem v: verem + - 4 49 50 + - 4 sorozat Az x sorozat elemei szimbólumok és számok. sorozat + - 4 sorozat verem v: verem Az y sorozat elemei szimbólumok és számok. Az x sorozat elemei szimbólumok és számok. A v veremben csak számok vannak. Token Operandus Operator ; 5 5
Token + - 4... operator >>... operator << virtual...is_operand virtual...is_operator virtual...to_string Token Operand Operator Operandus Operator ; 5... is_operand...... evaluateint op, int op... is_operator...... value... 54 Token Operand... is_operand......value Token... operator >>... operator << virtual...is_operand virtual...is_operator virtual...to_string Operator... is_operator...... evaluateint op, int op.. 55 A Token osztál deklaráció class Token Token.h friend std::ostream& operator<<std::ostream&, Token&; friend std::istream& operator>>std::istream&, Token&; public: virtual ~Tokenvoid; virtual bool is_leftp return false;; virtual bool is_rightp return false;; virtual bool is_operand return false;; virtual bool is_operator return false;; virtual bool is_end return false;; virtual int priority return 0;; virtual string to_stringreturn "";; virtual string class_namereturn "Token:";; protected: Token; ; 56 4
Token osztál implementáció includes A Token osztál implementáció - kiíró operátor #include<iostream> #include <string> using namespace std; #include "Token.h" #include "LEFTP.h" #include "RIGHTP.h" #include "END.h" #include "Operand.h" #include "Operator.h" Token.cpp ostream& operator <<ostream& s, Token& t s << t->to_string; ; return s; Virtuális függvény Token.cpp 57 58 Token osztál implementáció beolvasó operátor - istream& operator >> istream& s, Token& t char ch; int intval; s >> ch; switchch case '+': case '-':case '': case '/': t=new Operatorch; break; case '': t=new LEFTP; break; case '': t=new RIGHTP; break; case ';': t=new END; break; Token.cpp 59 Token osztál implementáció - beolvasó operátor - case '0':... case '9': s.putbackch; s >> intval; t=new Operandintval; break; default: cout << "Illegal element: " << ch << endl; s >> ch; return s; Token.cpp 60 5
Operandus Operand... is_operand...... value Token... operator >>... operator << virtual...is_operand virtual...is_operator virtual...to_string Operator... is_operator...... evaluateint op, int op.. Operand osztál deklaráció class Operand: public Token public: Operandint v val=v;; int value return val;; bool is_operand return true; ; string to_string; string class_name return "Operand: "; ; protected: int val; ; Operand.h 6 6 Operand osztál implementáció #include <string> using namespace std; #include "Token.h" #include "Operand.h" #include "Stack.h" string Operand::to_String string digit[0]="0","","","","4","5","6","7","8","9"; string s; Stack<string> v; ifval==0 v.push"0"; forint i=val;i!=0;i=i/0 v.pushdigit[i%0]; for;!v.empty;s=s+v.pop return s; ; Operand.cpp 6 Operator Operand... is_operand...... value Token... operator >>... operator << virtual...is_operand virtual...is_operator virtual...to_string Operator... is_operator...... evaluateint op, int op.. 64 6
Operator osztál deklaráció Operator osztál tostring class Operator: public Token public: Operatorchar o op=o;; bool is_operator return true; ; int priority; int evaluateconst int,const int; string to_string; string class_name return "Operator: "; ; Operator.h string Operator::to_String string ret; ret=op; return ret; ; Operator.cpp protected: char op; ; 65 66 Operator osztál priority Operator osztál evaluate int Operator::priority switchop case'+': case'-': return ; case'': case'/': return ; default: return ; ; Operator.cpp int Operator::evaluateconst int a,const int b switchop case'+': returna+b; case'-': returna-b; case'': returnab; case'/': returna/b; Operator.cpp 67 68 7
RIGHTP osztál deklaráció + implementáció LEFTP osztál deklaráció + implementáció class RIGHTP: public Token public: bool is_rightp return true; ; string to_stringreturn ""; ; string class_name return "Right parenthesi"; ; ; RIGHTP.h class LEFTP: public Token public: bool is_leftp return true; ; string to_stringreturn ""; ; string class_name return "Left parenthesi"; ; ; LEFTP.h 69 70 END osztál deklaráció + implementáció A Stack sablon osztály - class END: public Token public: bool is_end return true;; string to_stringreturn ";"; ; string class_name return "End of expression:"; ; ; END.h template <class Element> class Stack public: enum ExceptionsEMPTYSTACK; Stack:_top0; ~Stack; void pushconst Element&; Element top; Element pop; bool empty return _top == 0; Stack.h 7 7 8
A Stack sablon osztály - A Sequence sablon osztály - private: Stack.h Stackconst Stack<Element>&; Stack& operator=const Stack<Element>&; struct Node Element val; Node next; Nodeconst Element &v, Node n:valv,nextn ; Node _top; ; 7 template <class Element> class Sequence public: enum ExceptionsEMPTYSEQUENCE; Sequence:_first0,_last0,_current0 ; ~Sequence; void hiextconst Element&; Element lopop; void first _current = _first; void next _current = _current->next; Element current return _current->val; bool eol return _current == 0; bool empty return _first == 0; void print; Sequence.h 74 A Sequence sablon osztály - Modulszerkezet Token.h private: Sequenceconst Sequence<Element>&; Sequence.h Sequence& operator=const Sequence<Element>&; struct Node Element val; Node next; Node prev; Nodeconst Element &v, Node n, Node p:valv,nextn, prevp ; Node _first; Node _last; Node _current; ; LEFTP.h Operand.h Sequence.h Poland.cpp ENDP.h RIGHTP.h Stack.h Operator.h 75 76 9
Modulszerkezet LEFTP.h Operand.h Sequence.h TEMPLATE Token.h Poland.cpp ENDP.h RIGHTP.h Operator.h Stack.h TEMPLATE main.cpp - includes #include <string> using namespace std; #include "Token.h" #include "LEFTP.h" #include "RIGHTP.h" #include "END.h" #include "Operand.h" #include "Operator.h" #include "Stack.h" #include "Sequence.h" Token next_token; int main 77 78 main.cpp kifejezés beolvasása //Egy szintaktikusan helyes infix kifejezés elemeinek beolvasása Sequence<Token> x; Sequence<Token> y; Stack<Token> s; Token t; t=next_token; while!t->is_end x.hiextt; t=next_token; main.cpp: átalakítás //A kifejezés átalakítása lengyelformára x.first; while!x.eol t=x.current; ciklusmag x.next; for;!s.empty;y.hiexts.pop y.print; x.print; 79 80 0
main.cpp: átalakítás - ciklusmag ift->is_operand y.hiextt; else if t->is_leftp s.pusht; else ift->is_rightp while!s.top->is_leftp y.hiexts.pop; s.pop; main.cpp: átalakítás - ciklusmag else if t->is_operator while!s.empty && s.top->priority <= t->priority &&!s.top->is_leftp y.hiexts.pop; s.pusht; else cout << "Szintaktikai hiba?" << endl; 8 8 main.cpp: kiértékelés //A lengyelforma kiértékelése Stack<int> v; y.first; while!y.eol t=y.current; if t->is_operand v.pushdynamic_cast<operand>t->value; else v.pushdynamic_cast<operator>t->evaluatev.pop,v.pop; y.next; cout << "A kifejezes erteke: " << v.pop << endl; main.cpp: tárterület felszabadítása //A dinamikusan lefoglalt tárterület felszabadítása for x.first;!x.eol; x.next delete x.current; 8 84
+ - 4 + - 4 85 86 main.cpp: next_token + - 4 Token next_token char ch; int intval; cin >> ch; Token t; switchch 87 88
main.cpp:next_token case '+': case '-': case '': case '/': t=new Operatorch; break; case '': t=new LEFTP; break; case '': t=new RIGHTP; break; case ';': t=new END; break; main.cpp:next_token case '0': case '':... case '9': cin.putbackch; cin >> intval; t=new Operandintval; break; default: cout << "Illegal element: " << ch << endl; cin >> ch; return t; 89 90