logo

Cấu trúc dữ liệu 2005 P3

Tham khảo tài liệu 'cấu trúc dữ liệu 2005 p3', công nghệ thông tin, cơ sở dữ liệu phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Chöông 3 – Haøng ñôïi Chöông 3 – HAØNG ÑÔÏI 3.1. Ñònh nghóa haøng Trong caùc öùng duïng maùy tính, chuùng ta ñònh nghóa CTDL haøng laø moät danh saùch trong ñoù vieäc theâm moät phaàn töû vaøo ñöôïc thöïc hieän ôû moät ñaàu cuûa danh saùch (cuoái haøng), vaø vieäc laáy döõ lieäu khoûi danh saùch thöïc hieän ôû ñaàu coøn laïi (ñaàu haøng). Chuùng ta coù theå hình dung CTDL haøng cuõng gioáng nhö moät haøng ngöôøi laàn löôït chôø mua veù, ai ñeán tröôùc ñöôïc phuïc vuï tröôùc. Haøng coøn ñöôïc goïi laø danh saùch FIFO (First In First Out) Hình 3.1- Haøng ñôïi Caùc öùng duïng coù söû duïng haøng coøn phoå bieán hôn caùc öùng duïng coù söû duïng ngaên xeáp, vì khi maùy tính thöïc hieän caùc nhieäm vuï, cuõng gioáng nhö caùc coâng vieäc trong cuoäc soáng, moãi coâng vieäc ñeàu caàn phaûi ñôïi ñeán löôït cuûa mình. Trong moät heä thoáng maùy tính coù theå coù nhieàu haøng ñôïi caùc coâng vieäc ñang chôø ñeán löôït ñöôïc in, ñöôïc truy xuaát ñóa hoaëc ñöôïc söû duïng CPU. Trong moät chöông trình ñôn giaûn coù theå coù nhieàu coâng vieäc ñöôïc löu vaøo haøng ñôïi, hoaëc moät coâng vieäâc coù theå khôûi taïo moät soá coâng vieäc khaùc maø chuùng cuõng caàn ñöôïc löu vaøo haøng ñeå chôø ñeán löôït thöïc hieän. Phaàn töû ñaàu haøng seõ ñöôïc phuïc vuï tröôùc, thöôøng phaàn töû naøy ñöôïc goïi laø front, hay head cuûa haøng. Töông töï, phaàn töû cuoái haøng, cuõng laø phaàn töû vöøa ñöôïc theâm vaøo haøng, ñöôïc goïi laø rear hay tail cuûa haøng. Giaùo trình Caâu truùc döõ lieäu vaø Giaûi thuaät 37 Chöông 3 – Haøng ñôïi Ñònh nghóa: Moät haøng caùc phaàn töû kieåu T laø moät chuoãi noái tieáp caùc phaàn töû cuûa T, keøm caùc taùc vuï sau: 1. Taïo môùi moät ñoái töôïng haøng roãng. 2. Theâm moät phaàn töû môùi vaøo haøng, giaû söû haøng chöa ñaày (phaàn töû döõ lieäu môùi luoân ñöôïc theâm vaøo cuoái haøng). 3. Loaïi moät phaàn töû ra khoûi haøng, giaû söû haøng chöa roãng (phaàn töû bò loaïi laø phaàn töû taïi ñaàu haøng, thöôøng laø phaàn töû vöøa ñöôïc xöû lyù xong). 4. Xem phaàn töû taïi ñaàu haøng (phaàn töû saép ñöôïc xöû lyù). 3.2. Ñaëc taû haøng Ñeå hoaøn taát ñònh nghóa cuûa caáu truùc döõ lieäu tröøu töôïng haøng, chuùng ta ñaëc taû moïi taùc vuï maø haøng thöïc hieän. Caùc ñaëc taû naøy cuõng töông töï nhö caùc ñaëc taû cho ngaên xeáp, chuùng ta ñöa ra teân, kieåu traû veà, danh saùch thoâng soá, precondition, postcondition vaø uses cho moãi phöông thöùc. Entry bieåu dieãn moät kieåu toång quaùt cho phaàn töû chöùa trong haøng. template Queue::Queue(); post: ñoái töôïng haøng ñaõ toàn taïi vaø ñöôïc khôûi taïo laø haøng roãng. template ErrorCode Queue::append(const Entry &item); post: neáu haøng coøn choã, item ñöôïc theâm vaøo taïi rear, ErrorCode traû veà laø success; ngöôïc laïi, ErrorCode traû veà laø overflow, haøng khoâng ñoåi. template ErrorCode Queue::serve(); post: neáu haøng khoâng roãng, phaàn töû taïi front ñöôïc laáy ñi, ErrorCode traû veà laø success; ngöôïc laïi, ErrorCode traû veà laø underflow, haøng khoâng ñoåi. template ErrorCode Queue::retrieve(const Entry &item) const; post: neáu haøng khoâng roãng, phaàn töû taïi front ñöôïc cheùp vaøo item, ErrorCode traû veà laø success; ngöôïc laïi, ErrorCode traû veà laø underflow; caû hai tröôøng hôïp haøng ñeàu khoâng ñoåi. template bool Queue::empty() const; post: haøm traû veà true neáu haøng roãng; ngöôïc laïi, haøm traû veà false. Töø append (theâm vaøo haøng) vaø serve (ñaõ ñöôïc phuïc vuï) ñöôïc duøng cho caùc taùc vuï cô baûn treân haøng ñeå chæ ra moät caùch roõ raøng coâng vieäc thöïc hieän ñoái vôùi haøng, Giaùo trình Caâu truùc döõ lieäu vaø Giaûi thuaät 38 Chöông 3 – Haøng ñôïi vaø ñeå traùnh nhaàm laãn vôùi nhöõng töø maø chuùng ta seõ duøng vôùi caùc caáu truùc döõ lieäu khaùc. Chuùng ta coù lôùp Queue nhö sau: template class Queue { public: Queue(); bool empty() const; ErrorCode append(const Entry &item); ErrorCode serve(); ErrorCode retrieve(Entry &item) const; }; Ngoaøi caùc taùc vuï cô baûn nhö append, serve, retrieve, vaø empty ñoâi khi chuùng ta caàn theâm moät soá taùc vuï khaùc. Chaúng haïn nhö taùc vuï full ñeå kieåm tra xem haøng ñaõ ñaày hay chöa. Coù ba taùc vuï raát tieän lôïi ñoái vôùi haøng: clear ñeå doïn deïp caùc phaàn töû trong moät haøng coù saün vaø laøm cho haøng roãng, size cho bieát soá phaàn töû hieän coù trong haøng, cuoái cuøng laø serve_and_retrieve gom hai taùc vuï serve vaø retrieve laøm moät vì ngöôøi söû duïng thöôøng goïi hai taùc vuï naøy moät luùc. Chuùng ta coù theå boå sung caùc taùc vuï treân vaøo lôùp haøng ñaõ coù ôû treân. Tuy nhieân, chuùng ta coù theå taïo lôùp môùi coù theå söû duïng laïi caùc phöông thöùc vaø caùch hieän thöïc cuûa caùc lôùp ñaõ coù. Trong tröôøng hôïp naøy chuùng ta xaây döïng lôùp Extended_Queue ñeå boå sung caùc phöông thöùc theâm vaøo caùc phöông thöùc cô baûn cuûa lôùp Queue. Lôùp Extended_Queue ñöôïc goïi laø lôùp daãn xuaát töø lôùp Queue. Khaùi nieäm daãn xuaát cung caáp moät caùch ñònh nghóa caùc lôùp môùi ñôn giaûn baèng caùch boå sung theâm caùc phöông thöùc vaøo moät lôùp coù saün. Khaû naêng cuûa lôùp daãn xuaát söû duïng laïi caùc thaønh phaàn cuûa lôùp cô sôû ñöôïc goïi laø söï thöøa keá. Söï thöøa keá (inheritance) laø moät trong caùc ñaëc tính cô baûn cuûa laäp trình höôùng ñoái töôïng. Chuùng ta minh hoïa moái quan heä giöõa lôùp Queue vaø lôùp daãn xuaát Extended_Queue bôûi sô ñoà thöøa keá (hình 3.2a). Muõi teân chæ töø lôùp daãn xuaát ñeán lôùp cô sôû maø noù thöøa keá. Hình 3.2b minh hoïa söï thöøa keá caùc phöông thöùc vaø caùc phöông thöùc boå sung. Giaùo trình Caâu truùc döõ lieäu vaø Giaûi thuaät 39 Chöông 3 – Haøng ñôïi Hình 3.2- Söï thöøa keá vaø lôùp daãn xuaát Chuùng ta coù lôùp Extended_Queue: template class Extended_Queue: public Queue { public: bool full() const; int size() const; void clear(); ErrorCode serve_and_retrieve(Entry &item); }; Töø khoùa public trong khai baùo thöøa keá coù nghóa laø khaû naêng ngöôøi söû duïng nhìn thaáy ñoái vôùi caùc thaønh phaàn maø lôùp daãn xuaát coù ñöôïc qua söï thöøa keá seõ gioáng heät nhö khaû naêng ngöôøi söû duïng nhìn thaáy chuùng ôû lôùp cô sôû. Ñaëc taû cuûa caùc phöông thöùc boå sung: template bool Extended_Queue::full() const; post: traû veà true neáu haøng ñaày, ngöôïc laïi, traû veà false. Haøng khoâng ñoåi. template void Extended_Queue::clear(); post: moïi phaàn töû trong haøng ñöôïc loaïi khoûi haøng, haøng trôû neân roãng. template int Extended_Queue::size() const; post: traû veà soá phaàn töû hieän coù cuûa haøng. Haøng khoâng ñoåi. Giaùo trình Caâu truùc döõ lieäu vaø Giaûi thuaät 40 Chöông 3 – Haøng ñôïi template ErrorCode Extended_Queue::serve_and_retrieve(const Entry &item); post: neáu haøng khoâng roãng, phaàn töû taïi front ñöôïc cheùp vaøo item ñoàng thôøi ñöôïc loaïi khoûi haøng, ErrorCode traû veà laø success; ngöôïc laïi, ErrorCode traû veà laø underflow, haøng khoâng ñoåi. Moái quan heä giöõa lôùp Extended_Queue vaø lôùp Queue thöôøng ñöôïc goïi laø moái quan heä is-a vì moãi ñoái töôïng thuoäc lôùp Extended_Queue cuõng laø moät ñoái töôïng thuoäc lôùp Queue maø coù theâm moät soá ñaëc tính khaùc, ñoù laø caùc phöông thöùc serve_and_retrieve, full, size vaø clear. 3.3. Caùc phöông aùn hieän thöïc haøng 3.3.1. Caùc phöông aùn hieän thöïc haøng lieân tuïc 3.3.1.1. Moâ hình vaät lyù Töông töï nhö chuùng ta ñaõ laøm vôùi ngaên xeáp, chuùng ta coù theå taïo moät haøng trong boä nhôù maùy tính baèng moät daõy (kieåu döõ lieäu array) ñeå chöùa caùc phaàn töû cuûa haøng. Tuy nhieân, ôû ñaây chuùng ta caàn phaûi naém giöõ ñöôïc caû front vaø rear. Moät caùch ñôn giaûn laø chuùng ta giöõ front luoân laø vò trí ñaàu cuûa daõy. Luùc ñoù, ñeå theâm môùi moät phaàn töû vaøo haøng, chuùng ta taêng bieán ñeám bieåu dieãn rear y heät nhö chuùng ta theâm phaàn töû vaøo ngaên xeáp. Ñeå laáy moät phaàn töû ra khoûi haøng, chuùng ta phaûi traû moät giaù ñaét cho vieäc di chuyeån taát caû caùc phaàn töû hieän coù trong haøng tôùi moät böôùc ñeå laáp ñaày choã troáng taïi front. Maëc duø caùch hieän thöïc naøy raát gioáng vôùi hình aûnh haøng ngöôøi saép haøng ñôïi ñeå ñöôïc phuïc vuï, nhöng noù laø moät löïa choïn raát dôû trong maùy tính. 3.3.1.2. Hieän thöïc tuyeán tính Ñeå vieäc xöû lyù haøng coù hieäu quaû, chuùng ta duøng hai chæ soá ñeå naém giöõ front vaø rear maø khoâng di chuyeån caùc phaàn töû. Muoán theâm moät phaàn töû vaøo haøng, ñôn giaûn chuùng ta chæ caàn taêng rear leân moät vaø theâm phaàn töû vaøo vò trí naøy. Khi laáy moät phaàn töû ra khoûi haøng chuùng ta laáy phaàn töû taïi vò trí front vaø taêng front leân moät. Tuy nhieân phöông phaùp naøy coù moät nhöôïc ñieåm lôùn, ñoù laø front vaø rear luoân luoân taêng chöù khoâng giaûm. Ngay caû khi trong haøng khoâng bao giôø coù quaù hai phaàn töû, haøng vaãn ñoøi hoûi moät vuøng nhôù khoâng coù giôùi haïn neáu nhö caùc taùc vuï ñöôïc goïi lieân tuïc nhö sau: append, append, serve, append, serve, append, serve, append, serve, append, ... Vaán ñeà ôû ñaây laø khi caùc phaàn töû trong haøng dòch chuyeån tôùi trong daõy thì caùc vò trí ñaàu cuûa daõy seõ khoâng bao giôø ñöôïc söû duïng ñeán. Chuùng ta coù theå hình dung Giaùo trình Caâu truùc döõ lieäu vaø Giaûi thuaät 41 Chöông 3 – Haøng ñôïi haøng luùc ñoù troâng nhö moät con raén luoân tröôøn mình tôùi. Con raén coù luùc daøi ra, coù luùc ngaén laïi, nhöng neáu cöù tröôøn tôùi maõi theo moät höôùng thì cuõng phaûi ñeán luùc noù gaëp ñieåm döøng cuûa boä nhôù. Tuy nhieân, cuõng caàn chuù yù raèng trong caùc öùng duïng maø coù luùc haøng trôû neân roãng (khi moät loaït caùc yeâu caàu ñang ñôïi ñaõ ñöôïc giaûi quyeát heát taïi moät thôøi ñieåm naøo ñoù), thì taïi thôøi ñieåm naøy haøng coù theå ñöôïc saép xeáp laïi, front vaø rear ñöôïc gaùn trôû laïi veà ñaàu daõy. Tröôøng hôïp naøy cho thaáy vieäc söû duïng moät sô ñoà ñôn giaûn goàm hai chæ soá vaø moät boä nhôù tuyeán tính nhö vöøa neâu laø moät caùch hieän thöïc coù hieäu quaû cao. 3.3.1.3. Daõy voøng Veà yù nieäm, chuùng ta coù theå khaéc phuïc tính thieáu hieäu quaû trong vieäc söû duïng boä nhôù baèng caùch hình dung daõy coù daïng voøng thay vì tuyeán tính. Khi phaàn töû ñöôïc theâm vaøo hay laáy ra khoûi haøng, ñieåm ñaàu cuûa haøng seõ ñuoåi theo ñieåm cuoái cuûa haøng voøng theo daõy, vaø nhö vaäy con raén vaãn coù theå tröôøn tôùi voâ haïn nhöng vaãn bò nhoát trong moät voøng coù giôùi haïn. Taïi caùc thôøi ñieåm khaùc nhau, haøng seõ chieám nhöõng phaàn khaùc nhau trong daõy voøng, nhöng chuùng ta seõ khoâng bao giôø phaûi lo veà söï vöôït giôùi haïn boä nhôù tröø khi daõy thaät söï khoâng coøn phaàn töû troáng, tröôøng hôïp naøy ñöôïc xem nhö haøng ñaày, ErrorCode seõ nhaän trò overflow. Hieän thöïc cuûa daõy voøng Vaán ñeà tieáp theo cuûa chuùng ta laø duøng moät daõy tuyeán tính ñeå moâ phoûng moät daõy voøng. Caùc vò trí trong voøng troøn ñöôïc ñaùnh soá töø 0 ñeán max-1, trong ñoù max laø toång soá phaàn töû trong daõy voøng. Ñeå hieän thöïc daõy voøng, chuùng ta cuõng söû duïng caùc phaàn töû ñöôïc ñaùnh soá töông töï daõy tuyeán tính. Söï thay ñoåi caùc chæ soá chæ ñôn giaûn laø pheùp laáy phaàn dö trong soá hoïc: khi moät chæ soá taêng vöôït qua giôùi haïn max- 1, noù ñöôïc baét ñaàu trôû laïi vôùi trò 0. Ñieàu naøy töông töï vieäc coäng theâm giôø trong ñoàng hoà maët troøn, caùc giôø ñöôïc ñaùnh soá töø 1 ñeán 12, neáu chuùng ta coäng theâm 4 giôø vaøo 10 giôø chuùng ta seõ coù 2 giôø. Giaùo trình Caâu truùc döõ lieäu vaø Giaûi thuaät 42 Chöông 3 – Haøng ñôïi Hình 3.3- Haøng trong daõy voøng Daõy voøng trong C++ Trong C++, chuùng ta coù theå taêng chæ soá i trong moät daõy voøng nhö sau: i = ((i+1) == max) ? 0: (i+1); hoaëc if ((i+1) == max) i = 0; else i = i+1; hoaëc i = (i+1) % max; Caùc ñieàu kieän bieân Tröôùc khi vieát nhöõng giaûi thuaät theâm hoaëc loaïi phaàn töû ra khoûi haøng, chuùng ta haõy xem xeùt ñeán caùc ñieàu kieän bieân (boundary conditions), ñoù laø caùc daáu hieäu cho bieát haøng coøn roãng hay ñaõ ñaày. Giaùo trình Caâu truùc döõ lieäu vaø Giaûi thuaät 43 Chöông 3 – Haøng ñôïi Neáu trong haøng chæ coù moät phaàn töû thì caû front vaø rear ñeàu chæ ñeán phaàn töû naøy (hình 3.4 a). Khi phaàn töû naøy ñöôïc loaïi khoûi haøng, front seõ taêng leân 1. Do ñoù haøng laø roãng khi rear chæ vò trí ngay tröôùc front (hình 3.4 b). Do rear di chuyeån veà phía tröôùc moãi khi theâm phaàn töû môùi, neân khi haøng saép ñaày vaø baèng caùch di chuyeån voøng thì rear cuõng seõ gaàn gaëp front trôû laïi (hình 3.3 c). Luùc naøy khi phaàn töû cuoái cuøng ñöôïc theâm vaøo laøm cho haøng ñaày thì rear cuõng chæ vò trí ngay tröôùc front (hình 3.4 d). Chuùng ta gaëp moät khoù khaên môùi: vò trí töông ñoái cuûa front vaø rear gioáng heät nhau trong caû hai tröôøng hôïp haøng ñaày vaø haøng roãng. (a) (b) (c) (d) Hình 3.4- Hình aûnh minh hoïa haøng roãng vaø haøng ñaày Caùc caùch giaûi quyeát coù theå Giaùo trình Caâu truùc döõ lieäu vaø Giaûi thuaät 44 Chöông 3 – Haøng ñôïi Coù ít nhaát 3 caùch giaûi quyeát cho vaán ñeà neâu treân. Caùch thöù nhaát laø daønh laïi moät vò trí troáng khi haøng ñaày, rear seõ caùch front moät vò trí giöõa. Caùch thöù hai laø söû duïng theâm moät bieán, chaúng haïn moät bieán côø kieåu bool seõ coù trò true khi rear nhích ñeán saùt front trong tröôøng hôïp haøng ñaày (chuùng ta coù theå tuøy yù choïn tröôøng hôïp haøng ñaày hay roãng), hay moät bieán ñeám ñeå ñeám soá phaàn töû hieän coù trong haøng. Caùch thöù ba laø cho moät hoaëc caû hai chæ soá front vaø rear mang moät trò ñaëc bieät naøo ñoù ñeå chæ ra haøng roãng, ví duï nhö rear seõ laø -1 khi haøng roãng. 3.3.1.4. Toång keát caùc caùch hieän thöïc cho haøng lieân tuïc Ñeå toång keát nhöõng ñieàu ñaõ baøn veà haøng, chuùng ta lieät keâ döôùi ñaây taát caû caùc phöông phaùp maø chuùng ta ñaõ thaûo luaän veà caùc caùch hieän thöïc haøng. • Moâ hình vaät lyù: moät daõy tuyeán tính coù front luoân chæ vò trí ñaàu tieân trong haøng vaø moïi phaàn töû cuûa haøng phaûi di chuyeån tôùi moät böôùc khi phaàn töû taïi front ñöôïc laáy ñi. Ñaây laø phöông phaùp raát dôû trong maùy tính noùi chung. • Moät daõy tuyeán tính coù hai chæ soá front vaø rear luoân luoân taêng. Ñaây laø phöông phaùp toát neáu nhö haøng coù theå ñöôïc laøm roãng. • Moät daõy voøng coù hai chæ soá front,rear vaø moät vò trí ñeå troáng. • Moät daõy voøng coù hai chæ soá front,rear vaø moät côø cho bieát haøng ñaày (hoaëc roãng). • Moät daõy voøng coù hai chæ soá front,rear vaø moät bieán ñeám soá phaàn töû hieän coù trong haøng. • Moät daõy voøng coù hai chæ soá front,rear maø hai chæ soá naøy seõ mang trò ñaëc bieät trong tröôøng hôïp haøng roãng. 3.3.2. Phöông aùn hieän thöïc haøng lieân keát Baèng caùch söû duïng boä nhôù lieân tuïc, vieäc hieäc thöïc haøng khoù hôn vieäc hieän thöïc ngaên xeáp raát nhieàu do chuùng ta duøng vuøng nhôù tuyeán tính ñeå giaû laëp toå chöùc voøng vaø gaëp khoù khaên trong vieäc phaân bieät moät haøng ñaày vôùi moät haøng roãng. Tuy nhieân, hieän thöïc haøng lieân keát laïi thöïc söï deã daøng nhö hieän thöïc ngaên xeáp lieân keát. Chuùng ta chæ caàn naém giöõ hai con troû, front vaø rear ñeå tham chieáu ñeán phaàn töû ñaàu vaø phaàn töû cuoái cuûa haøng. Caùc taùc vuï theâm hay loaïi phaàn töû treân haøng ñöôïc minh hoïa trong hình 3.5. Giaùo trình Caâu truùc döõ lieäu vaø Giaûi thuaät 45 Chöông 3 – Haøng ñôïi Hình 3.5 Caùc taùc vuï theâm vaø loaïi phaàn töû treân haøng lieân keát 3.4. Hieän thöïc haøng 3.4.1. Hieän thöïc haøng lieân tuïc Hieän thöïc voøng cho haøng lieân tuïc trong C++ Phaàn naøy trình baøy caùc phöông thöùc cuûa caùch hieän thöïc haøng baèng daõy voøng coù bieán ñeám caùc phaàn töû. Chuùng ta coù ñònh nghóa lôùp Queue nhö sau: const int maxQueue = 10; // Giaù trò nhoû chæ ñeå kieåm tra CTDL Queue. template class Queue { public: Queue(); bool empty() const; ErrorCode serve(); ErrorCode append(const Entry &item); ErrorCode retrieve(Entry &item) const; protected: int count; int front, rear; Entry entry[maxQueue]; }; Caùc döõ lieäu thaønh phaàn trong lôùp Queue ñöôïc khai baùo protected. Ñoái vôùi ngöôøi söû duïng seõ khoâng coù gì thay ñoåi, nghóa laø chuùng vaãn khoâng ñöôïc ngöôøi söû duïng nhìn thaáy vaø vaãn ñaûm baûo söï che daáu thoâng tin. Muïc ñích ôû ñaây laø khi chuùng ta xaây döïng lôùp Extended_Queue daãn xuaát töø lôùp Queue thì lôùp daãn xuaát seõ söû duïng ñöôïc caùc döõ lieäu thaønh phaàn naøy. Khi caùc döõ lieäu thaønh phaàn cuûa lôùp cô sôû ñöôïc khai baùo laø private thì lôùp daãn xuaát cuõng seõ khoâng nhìn thaáy chuùng. template Queue::Queue() /* post: ñoái töôïng haøng ñaõ toàn taïi vaø ñöôïc khôûi taïo laø haøng roãng. */ Giaùo trình Caâu truùc döõ lieäu vaø Giaûi thuaät 46 Chöông 3 – Haøng ñôïi { count = 0; rear = maxQueue - 1; front = 0; } template bool Queue::empty() const /* post: haøm traû veà true neáu haøng roãng; ngöôïc laïi, haøm traû veà false. */ { return count == 0; } template ErrorCode Queue::append(const Entry &item) /* post: neáu haøng coøn choã, item ñöôïc theâm vaøo taïi rear, ErrorCode traû veà laø success; ngöôïc laïi, ErrorCode traû veà laø overflow, haøng khoâng ñoåi. */ { if (count >= maxQueue) return overflow; count++; rear = ((rear + 1) == maxQueue) ? 0 : (rear + 1); entry[rear] = item; return success; } template ErrorCode Queue::serve() /* post: neáu haøng khoâng roãng, phaàn töû taïi front ñöôïc laáy ñi, ErrorCode traû veà laø success; ngöôïc laïi, ErrorCode traû veà laø underflow, haøng khoâng ñoåi. */ { if (count Chöông 3 – Haøng ñôïi Queue, neáu nhö count ñöôïc khai baùo laø private thì phöông thöùc size cuûa lôùp Extended_Queue phaûi söû duïng haøng loaït caâu leänh goïi caùc phöông thöùc public cuûa Queue nhö serve, retrieve, append môùi thöïc hieän ñöôïc. Caùc phöông thöùc coøn laïi cuûa Extended_Queue cuõng töông töï, vaø chuùng ta daønh laïi phaàn baøi taäp. template int Extended_Queue::size() const /* post: traû veà soá phaàn töû hieän coù cuûa haøng. Haøng khoâng ñoåi. */ { return count; } 3.4.2. Hieän thöïc haøng lieân keát 3.4.2.1. Caùc khai baùo cô baûn Vôùi moïi haøng, chuùng ta duøng kieåu Entry cho kieåu cuûa döõ lieäu löu trong haøng. Ñoái vôùi hieän thöïc lieân keát, chuùng ta khai baùo caùc node töông töï nhö ñaõ laøm cho ngaên xeáp lieân keát trong chöông 2. Chuùng ta coù ñaëc taû döôùi ñaây: template class Queue { public: // Caùc phöông thöùc chuaån cuûa haøng Queue(); bool empty() const; ErrorCode append(const Entry &item); ErrorCode serve(); ErrorCode retrieve(Entry &item) const; // Caùc phöông thöùc baûo ñaûm tính an toaøn cho haøng lieân keát ~Queue(); Queue(const Queue &original); void operator =(const Queue &original); protected: Node *front, *rear; }; Constructor thöù nhaát khôûi taïo moät haøng roãng: template Queue::Queue() /* post: ñoái töôïng haøng ñaõ toàn taïi vaø ñöôïc khôûi taïo laø haøng roãng. */ { front = rear = NULL; } Giaùo trình Caâu truùc döõ lieäu vaø Giaûi thuaät 48 Chöông 3 – Haøng ñôïi Phöông thöùc append theâm moät phaàn töû vaøo ñaàu rear cuûa haøng: template ErrorCode Queue::append(const Entry &item) /* post: neáu haøng coøn choã, item ñöôïc theâm vaøo taïi rear, ErrorCode traû veà laø success; ngöôïc laïi, ErrorCode traû veà laø overflow, haøng khoâng ñoåi. */ { Node *new_rear = new Node (item); if (new_rear == NULL) return overflow; if (rear == NULL) front = rear = new_rear; // tröôøng hôïp ñaëc bieät: theâm vaøo haøng ñang roãng. else { rear->next = new_rear; rear = new_rear; } return success; } Tröôøng hôïp haøng roãng caàn phaân bieät vôùi caùc tröôøng hôïp bình thöôøng khaùc, do khi theâm moät node vaøo moät haøng roãng caàn phaûi gaùn caû front vaø rear tham chieáu ñeán node naøy, trong khi vieäc theâm moät node vaøo moät haøng khoâng roãng chæ coù rear laø caàn ñöôïc gaùn laïi. Phöông thöùc loaïi moät phaàn töû ra khoûi haøng ñöôïc vieát nhö sau: template ErrorCode Queue::serve() /* post: neáu haøng khoâng roãng, phaàn töû taïi front ñöôïc laáy ñi, ErrorCode traû veà laø success; ngöôïc laïi, ErrorCode traû veà laø underflow, haøng khoâng ñoåi. */ { if (front == NULL) return underflow; Node *old_front = front; front = old_front->next; if (front == NULL) rear= NULL;// tröôøng hôïp ñaëc bieät: loaïi phaàn töû cuoái cuøng cuûa haøng delete old_front; return success; } Moät laàn nöõa tröôøng hôïp haøng roãng caàn ñöôïc xem xeùt rieâng. Khi phaàn töû ñöôïc loaïi khoûi haøng khoâng phaûi laø phaàn töû cuoái trong haøng, chæ coù front caàn ñöôïc gaùn laïi, ngöôïc laïi caû front vaø rear caàn phaûi gaùn veà NULL. Caùc phöông thöùc khaùc cuûa haøng lieân keát ñöôïc daønh laïi cho phaàn baøi taäp. Giaùo trình Caâu truùc döõ lieäu vaø Giaûi thuaät 49 Chöông 3 – Haøng ñôïi Neáu so saùnh vôùi haøng lieân tuïc, chuùng ta seõ thaáy raèng haøng lieân keát deã hieåu hôn caû veà maët khaùi nieäm caû veà caùch hieän thöïc chöông trình. 3.4.3. Haøng lieân keát môû roäng Hieän thöïc lieân keát cuûa lôùp Queue cung caáp moät lôùp cô sôû cho caùc lôùp khaùc. Ñònh nghóa döôùi ñaây daønh cho lôùp daãn xuaát Extended_Queue hoaøn toaøn töông töï nhö haøng lieân tuïc. template class Extended_queue: public Queue { public: bool full() const; int size() const; void clear(); ErrorCode serve_and_retrieve(Entry &item); }; Maëc duø lôùp Extended_Queue naøy coù hieän thöïc lieân keát, nhöng noù khoâng caàn caùc phöông thöùc nhö copy contructor, overloaded assignment, hoaëc destructor. Ñoái vôùi moät trong caùc phöông thöùc naøy, trình bieân dòch seõ goïi caùc phöông thöùc maëc ñònh cuûa lôùp Extended_Queue. Phöông thöùc maëc ñònh cuûa moät lôùp daãn xuaát seõ goïi phöông thöùc töông öùng cuûa lôùp cô sôû. Chaúng haïn, khi moät ñoái töôïng cuûa lôùp Extended_Queue chuaån bò ra khoûi taàm vöïc, destructor maëc ñònh cuûa lôùp Extended_Queue seõ goïi destructor cuûa lôùp Queue: moïi node caáp phaùt ñoäng cuûa Extended_Queue ñeàu ñöôïc giaûi phoùng. Do lôùp Extended_Queue cuûa chuùng ta khoâng chöùa theâm thuoäc tính con troû naøo ngoaøi caùc thuoäc tính con troû thöøa keá töø lôùp Queue, destructor maø trình bieân dòch goïi ñaõ laøm ñöôïc taát caû nhöõng ñieàu maø chuùng ta mong muoán. Caùc phöông thöùc ñöôïc khai baùo cho lôùp Extended_Queue caàn ñöôïc vieát laïi cho phuø hôïp vôùi caáu truùc lieân keát cuûa haøng. Chaúng haïn, phöông thöùc size caàn söû duïng moät con troû taïm window ñeå duyeät haøng (noùi caùch khaùc, con troû window seõ di chuyeån doïc theo haøng vaø laàn löôït chæ ñeán töøng node trong haøng). template int Extended_queue::size() const /* post: traû veà soá phaàn töû hieän coù cuûa haøng. Haøng khoâng ñoåi. */ { Node *window = front; int count = 0; while (window != NULL) { window = window->next; count++; } return count; } Caùc phöông thöùc khaùc cuûa Extended_Queue lieân keát xem nhö baøi taäp. Giaùo trình Caâu truùc döõ lieäu vaø Giaûi thuaät 50
DMCA.com Protection Status Copyright by webtailieu.net