$EVWUDNWDGDWDW\SHURFK 'DWDVWUXNWXUHU Dstr - 1 3URJUDPE\JJQDGVNRQVWHQV HOHPHQW Dstr - 2 $EVWUDNWDGDWDW\SHU +HOWDO/LVWD6WDFN. 7DEHOO $OJRULWPHU 6 NQLQJVRUWHULQJWUDYHUVHULQJ.RQWUROOVWUXNWXUHU IRULIZKLOH 1
'DWDW\SHQ Dstr - 3 'DWDW\SHQ $QYlQGDUH VSHFLILNDWLRQ LPSOHPHQWDWLRQ Dstr - 4 'DWD ElU LQIRUPDWLRQ JHQRP DWW UHSUHVHQWHUD QnJRW ² 'DWDREMHNWHW µ/xqfk PHOODQ RFK µ DY W\SHQ WH[W NDQ LQIRUPHUD RP DWW DIIlUHQ lu VWlQJG JHQRP DWW UHSUHVHQWHUD DWW GH VRP DUEHWDU GlU lwhu OXQFK PHOODQ NORFNDQ RFK ² 'DWDW\S ² (Q GDWDW\S lu HQ W\S DY GDWD $QYlQGDUHQ $QYlQGDUHQ lu EHJUlQVDG WLOO DWW DQYlQGD GDWDW\SHQ L HQOLJKHW PHG GHVV VSHFLILNDWLRQ 'DWDW\S REMHNW RSHUDWRUHU ² 7LOO GDWDW\SHQ KHOWDO K U LQWH HQGDVW GH HQVNLOGD KHOWDOHQ XWDQ RFNVn IXQNWLRQHU VRP DGGLWLRQ RFK VXEVWUDNWLRQ UHODWLRQHU VRP PLQGUH lq RFK VW UUH lq RVY $EVWUDNW GDWDW\S ² (Q WHUP VRP DQYlQGV QlU PDQ YLOO EHVNULYD GLVNXWHUD HOOHU DQYlQGD HQ GDWDW\S XWDQ DWW WD QnJUD KlQV\Q WLOO YDUH VLJ RP HOOHU KXU GHQ lu UHDOLVHUDG L SURJUDPVSUnNHW RFK KnUGYDUDQ 8SSPlUNVDPKHWHQ NRQFHQWUHUDV Sn YDG RSHUDWLRQHUQD J U RFK YLOND UHVXOWDW GH JHU 6SHFLILNDWLRQHQ EHVNULYHU JUlQV\WDQ WLOO GDWDW\SHQV LPSOHPHQWHULQJ,PSOHPHQWDWLRQHQ DY GDWDW\SHQ lu GROG I U DQYlQGDUHQ 2
Dstr - 5 Dstr - 6 ) UVODJWLOOVSHFLILNDWLRQ push() pop() SRS 2P VWDFNHQ lu WRP UHWXUQHUDU IXQNWLRQ SRS QROO, DQQDW IDOO UHWXUQHUDU IXQNWLRQHQ GHW YlUGH VRP I UHNRPPHU L WRSSHQ DY VWDFNHQ RFK QlVWD YlUGH L VWDFNHQ NRPPHU DWW EOL VWDFNHQV WRSS SXVK )XQNWLRQHQ SXVK DQURSDV PHG HQ SDUDPHWHU VRP KDU GHW YlUGH VRP VND SODFHUDV OlQJVW XSS L VWDFNHQ 6WDFNHQV WRSS NRPPHU GlUHIWHU DWW EHVWn DY GHWWD Q\D YlUGH HPSW\ )XQNWLRQHQ HPSW\ UHWXUQHUDU WUXH RP VWDFNHQ lu WRP L DQQDW IDOO UHWXUQHUDU IXQNWLRQHQ IDOVH 3
Dstr - 7 Dstr - 8 ) UVODJWLOOJUlQV\WD ) UVODJWLOOHQLPSOHPHQWDWLRQ class Stack public: Stack(); virtual ~Stack(); //Konstruktor //Destruktor push(7); push(5); top 0 top 1 top 2 TYPE pop(); void push(type item); //Tar bort elementet i stackens //topp. //Lägger in ett nytt element i //stackens topp bool empty(void)const; //Sann om stacken är tom private: //DET HÄR ÄR INGET FÖR ANVÄNDAREN AV STACK!!! TYPE *data; int top; ; data [0] [1] [2] [3] [4] [5] Z / &? # data [0] [1] [2] [3] [4] [5] 7 / &? # data [0] [1] [2] [3] [4] [5] 5 7 &? # [9999] [10000] a a [9999] [10000] a a [9999] [10000] a a 4
Dstr - 9 Dstr - 10 ) UVODJWLOOHQLPSOHPHQWDWLRQ ([HPSHOSnDQYlQGQLQJ Stack<TYPE>::Stack(void) top = 0; data = new TYPE[10000]; Stack<TYPE>::~Stack(void) delete [] data; TYPE Stack<TYPE>::pop(void) if (!empty()) return data[--top]; else return 0; void Stack<TYPE>::push(TYPE item) data[top++] = item; bool Stack<TYPE>::empty(void)const return (top > 0)? false : true; #include <iostream.h> #include "stack.h" int main(void) cout <<"Skriv några tal så räknar jag upp dom!" <<endl; cout << "Bryt inmatningen med noll." << endl; cout << endl; Stack<double> stacken; int nr = 1; double tal = -1.0; cout << "Tal "<< nr++ << " =>: "; cin >> tal; while (tal!=0.0) stacken.push(tal); cout << "Tal "<< nr++ << " =>: "; cin >> tal; cout <<endl <<"Nu skriver jag ut talen!" <<endl <<endl; while (!stacken.empty()) cout << stacken.pop() << '\t'; cout << endl << endl; cout << "Det var alla tal i omvänd ordning!" << endl; return 0; 5
Dstr - 11 Dstr - 12 6DPPDJUlQV\WDPRWDQYlQGDUHQ 0HQHQKHOWDQQDQ LPSOHPHQWDWLRQ class Stack public: Stack(); virtual ~Stack(); TYPE pop(); void push(type item); //Konstruktor //Destruktor //Tar bort elementet i stackens //topp. //Lägger in ett nytt element i //stackens topp push(7); top push(5); top 5 bool empty(void)const; //Sann om stacken är tom private: //DET HÄR ÄR INGET FÖR ANVÄNDAREN AV STACK!!! Node<TYPE> *top; ; top 7 7 6
Dstr - 13 Dstr - 14 (QKHOWDQQDQLPSOHPHQWDWLRQGHO //*Node********************************************** class Node friend class Stack<TYPE>; private: Node(TYPE item, Node* nextnode = 0); TYPE data; Node *next; ; //*************************************************** //-Node---------------------------------------------- Node<TYPE>::Node(TYPE item, Node* nextnode) data = item; next = nextnode; - (QKHOWDQQDQLPSOHPHQWDWLRQGHO //-Stack--------------------------------------------- Stack<TYPE>::Stack(void) top = 0; //-~Stack------------------------------------------- Stack<TYPE>::~Stack(void) while (!empty()) Node<TYPE> *extrapek = top; top = top->next; delete extrapek; //-push--------------------------------------------- void Stack<TYPE>::push(TYPE item) if (empty()) top = new Node<TYPE>(item); else top = new Node<TYPE>(item, top); 7
Dstr - 15 'DWDW\SHQN Dstr - 16 (QKHOWDQQDQLPSOHPHQWDWLRQGHO //-pop---------------------------------------------- TYPE Stack<TYPE>::pop(void) if (!empty()) TYPE item = top->data; Node<TYPE> *extrapek = top; top = top->next; delete extrapek; return item; else return 0; //-empty-------------------------------------------- bool Stack<TYPE>::empty(void)const return (top!= 0)? false : true; HQTXHXH 4XHXH GHTXHXH 8
'DWDW\SHQN Dstr - 17 'DWDW\SHQN Dstr - 18 ) UVODJWLOOVSHFLILNDWLRQ ) UVODJWLOOJUlQV\WD 9
Dstr - 19 Dstr - 20 'DWDW\SHQOLVWD 'DWDW\SHQOLVWD Exempel på användning #include "dubbellista.h" int main(void) oos_list<char*> minlista; LQVHUW) minlista.append("ett"); minlista.append("två"); minlista.append("tre"); minlista.append("fyra"); minlista.append("fem"); oos_iter<char*> j(minlista); UHPRYH for (j.last(); j.okay(); j.prev()) cout << j() << endl; cout << endl; minlista.insert("sex"); for (j.first(); j.okay(); j.next()) cout << j() << endl; cout << endl; minlista.clear(); return 0; fem fyra tre tvõ ett ett tvõ tre fyra fem sex 1
'DWDW\SHQOLVWD Dstr - 21 'DWDW\SHQOLVWD Dstr - 22 *UlQV\WD class oos_list friend class oos_iter<type>; public: oos_list(); oos_list(const TYPE &t); ~oos_list(); void append(const TYPE &); void prepend(const TYPE &); void insert(const TYPE &); void clear(); void remove(); void last(); void first(); TYPE &curitem()const; TYPE &firstitem()const; TYPE &lastitem()const; bool okay()const; bool hascur()const; bool hasfirst()const; bool haslast()const; void next(); void prev(); bool hasnext()const; bool hasprev()const; int size()const; 6SHFLILNDWLRQ private: //DET HÄR ÄR INGET FÖR DEN SOM ANVÄNDER LISTAN! int _size; oos_link<type> *_cur; oos_link<type> *_last; oos_link<type> *_first; ; 1
,WHUDWRU Dstr - 23,WHUDWRU Dstr - 24 *UlQV\WD 6SHFLILNDWLRQ class oos_iter public: oos_iter(const oos_list<type> &l); void first(); void last(); void next(); void prev(); bool okay()const; TYPE &operator()()const; TYPE &item()const; int hasnext()const; int hasprev()const; private: ; oos_link<type> *link; const oos_list<type> &list; 1
'XVNDNXQQD«Dstr - 25 'X VND YHWD YDG HQ DEVWUDNW GDWDW\S lu 'X VND NXQQD DQYlQGD GDWDW\SHUQD VWDFN N RFK OLVWD 'X VND NXQQD DQYlQGD HQ LWHUDWRU 'X VND I UVWn KXU OlQNDGH VWUXNWXUHU IXQJHUDU 1