BÀI GIẢNG TÓM TẮT CẤU TRÚC DỮ LIỆU VÀ THUẬT GIẢI 1 (Dành cho sinh viên ngành công nghệ thông tin).
TR ỜNG ĐẠI HỌC ĐÀ LẠT KHOA CÔNG NGH THÔNG TIN NGUYỄN THỊ THANH BÌNH TRẦN TUẤN MINH BÀI GIẢNG TÓM TẮT CẤU TRÚC DỮ LI U VÀ THUẬT GIẢI Dành cho sinh viên ngành công ngh thông tin (L u hành nội bộ) Đà Lạt 2008 Cấu trúc liệu thuật giải M CL C M CL C L I NÓI Đ U CH NG 1: GI I THI U C U TRÚC D LI U VÀ PHÂN TÍCH THU T GI I 1.1 Từ tốn đến ch ng trình 1.1.1 Mơ hình hóa tốn thực tế 1.1.2 Thu t gi i (algorithms) 1.2 Kiểu li u trừu t ợng (Abstract Data Type - ADT) 12 1.2.1 Khái ni m trừu t ợng hóa 12 1.2.2 Trừu t ợng hóa ch ng trình 12 1.2.3 Trừu t ợng hóa li u 13 1.2.4 Kiểu li u, c u trúc li u kiểu li u trừu t ợng (Data Types, Data Structures, Abstract Data Types) 14 1.3 PHÂN TÍCH THU T GI I 15 1.3.1 Thu t gi i v n đề liên quan 15 1.3.2 Tính hi u qu c a thu t gi i 16 1.3.3 Ký hi u O biểu di n th i gian ch y b i ký hi u O 19 1.3.4 Đánh giá th i gian ch y c a thu t gi i 23 CH NG 2: TÌM KI M VÀ S P X P TRONG 32 2.1 Các ph ng pháp tìm kiếm 32 2.1.1 Ph ng pháp tìm kiếm tuyến tính 32 2.1.2 Tìm kiếm nhị phân 34 2.2 Các ph ng pháp xếp 36 2.2.1 Thu t gi i xếp chọn (Selection Sort) 37 2.2.2 Thu t gi i xếp chèn (Insertion Sort) 40 2.2.3 Thu t gi i xếp đ i ch trực tiếp (Interchange Sort) 43 2.2.4 Thu t gi i xếp n i bọt (Bubble Sort) 45 2.2.5 Thu t gi i shaker (Shaker Sort) 47 2.2.6 Thu t gi i Shell (Shell Sort) 48 2.2.7 Thu t gi i vun đống (Heap Sort) 50 2.2.8 Thu t gi i xếp nhanh (Quick Sort) 54 2.2.9 Thu t gi i xếp trộn (Merge Sort) 58 2.2.10 Ph ng pháp xếp theo c số (Radix Sort) 63 CH NG 3: C U TRÚC VÀ DANH SÁCH LIÊN K T .71 3.1 Giới thi u đối t ợng li u trỏ 71 3.1.1 C u trúc li u tĩnh c u trúc li u động 71 3.1.2 Kiểu trỏ 71 3.2 Danh sách liên kết 74 3.2.1 Định nghĩa 74 Cấu trúc liệu thuật giải 3.2.2 T ch c danh sách liên kết 75 3.3 Danh sách liên kết đ n 76 3.3.1 T ch c danh sách theo cách c p phát liên kết 76 3.3.2 Định nghĩa c u trúc danh sách liên kết 78 3.3.3 Các thao tác c b n danh sách liên kết đ n 79 3.4 Sắp xếp danh sách 93 3.5 Một số c u trúc đặc bi t c a danh sách liên kết đ n 96 3.5.1 Ngăn xếp (Stack) 96 3.5.2 Hàng đợi (Queue) 102 3.6 Một số c u trúc li u d ng danh sách liên kết khác 107 3.6.1 Danh sách liên kết vòng 107 3.6.2 Danh sách liên kết kép 111 TÀI LI U THAM KH O Cấu trúc liệu thuật giải L I NÓI Đ U C u trúc li u thu t gi i kiến th c t ng c a ch ng trình đào t o ngành cơng ngh thơng tin Trong h thống tín c a ch ng trình đào t o t i khoa Công ngh thông tin tr ng Đ i học Đà L t, lĩnh vực đ ợc t ch c thành học ph n: c u trúc li u thu t gi i 1, c u trúc li u thu t gi i Nội dung học ph n c u trúc li u thu t gi i đ ợc t ch c ch ng: • Ch ng trình bày t ng quan c u trúc li u thu t gi i o Các b ớc l p trình để gi i cho toán, o Các khái ni m kiểu li u, kiểu li u trừu t ợng, o Tiếp c n phân tích thu t gi i • Ch ng trình bày ph ng pháp tìm kiếm xếp o Ph ng pháp tìm kiếm tuyến tính, tìm kiếm nhị phân; o Các thu t gi i xếp: Chọn trực tiếp, Chèn trực tiếp, đ i ch trực tiếp, Heap sort, Quick sort, • Ch ng trình bày c u trúc li u danh sách liên kết o Định nghĩa t ch c danh sách liên kết o Danh sách liên kết đ n: định nghĩa, cách t ch c thao tác c b n o Các c u trúc đặc bi t c a danh sách liên kết đ n: Ngăn xếp, Hàng đợi o Các c u trúc li u d ng danh sách liên kết khác nh danh sách liên kết vịng, danh sách liên kết kép Vì trình độ ng i biên so n có h n nên t p giáo trình khơng tránh khỏi nhiều khiếm khuyết, Chúng tơi r t mong góp ý c a b n đồng nghi p sinh viên Cuối cùng, Chúng c m n động viên, giúp đỡ c a b n đồng nghi p khoa Công ngh thông tin để t p giáo trình tóm tắt đ ợc hồn thành Các tác gi Cấu trúc liệu thuật giải Ch ng 1: Gi i Thi u C u Trúc D Li u Và Phân Tích Thu t Gi i M c tiêu Sau học xong ch ng này, sinh viên sẽ: - Nắm đ ợc b ớc l p trình để gi i cho toán - Nắm vững khái ni m kiểu li u trừu t ợng, khác kiểu li u, kiểu li u trừu t ợng c u trúc li u - Tiếp c n phân tích thu t gi i Ki n th c c b n c n thi t Các kiến th c c b n c n thiết để học ch ng bao gồm: Kh nh n biết gi i toán theo h ớng tin học hóa N i dung cốt lõi ng nghiên c u v n đề sau: Ch - Cách tiếp c n từ toán đến ch - Kiểu li u trừu t ợng (Abstract Data Type) - Kiểu li u – Kiểu li u trừu t ợng – C u trúc li u - Phân tích thu t gi i 1.1 Từ tốn đ n ch ng trình ng trình 1.1.1 Mơ hình hóa tốn thực t Để gi i tốn thực tế máy tính ta ph i bắt đ u từ vi c xác định tốn Nhiều th i gian cơng s c bỏ để xác định toán c n gi i quyết, t c ph i tr l i rõ ràng câu hỏi "ph i làm gì?" sau "làm nh nào?" Thơng th ng, kh i đ u, h u hết toán không đ n gi n, không rõ ràng Để gi m bớt ph c Cấu trúc liệu thuật giải t p c a tốn thực tế, ta ph i hình th c hóa nó, nghĩa phát biểu l i tốn thực tế thành tốn hình th c (hay cịn gọi mơ hình tốn) Có thể có r t nhiều tốn thực tế có mơ hình tốn Ví dụ 1: Tơ màu b n đồ giới Ta c n ph i tô màu cho n ớc b n đồ giới Trong m i n ớc đ ợc tô màu hai n ớc láng giềng (cùng biên giới) ph i đ ợc tô hai màu khác Hãy tìm ph ng án tơ màu cho số màu sử dụng nh t Ta xem m i n ớc b n đồ giới đỉnh c a đồ thị, hai n ớc láng giềng c a hai đỉnh ng với đ ợc nối với c nh Bài toán lúc tr thành toán tô màu cho đồ thị nh sau: M i đỉnh ph i đ ợc tơ màu, hai đỉnh có c nh nối ph i tơ hai màu khác ta c n tìm ph ng án tô màu cho số màu đ ợc sử dụng nh t Ví dụ 2: Đèn giao thơng Cho ngã năm nh hình I.1, C E đ tên, đ ng chiều theo chiều mũi ng khác hai chiều Hãy thiết kế b ng đèn hi u điều khiển giao thông t i ngã năm cách hợp lý, nghĩa là: phân chia lối t i ngã năm thành nhóm, m i nhóm gồm lối đi đồng th i nh ng không x y tai n n giao thông (các h ớng không cắt nhau), số l ợng nhóm nh t đ ợc Ta xem đ u vào (input) c a toán t t c lối t i ngã năm này, đ u (output) c a tốn nhóm lối đi đồng th i mà không x y tai n n giao thơng, m i nhóm t ng ng với pha điều khiển c a đèn hi u, v y ta ph i tìm kiếm l i gi i với số nhóm nh t để giao thơng khơng bị tắc nghẽn ph i ch đợi lâu Cấu trúc liệu thuật giải Tr ớc hết ta nh n th y t i ngã năm có 13 lối đi: AB, AC, AD, BA, BC, BD, DA, DB, DC, EA, EB, EC, ED T t nhiên, để gi i đ ợc toán ta ph i tìm cách để thể hi n mối liên quan lối Lối với lối đồng th i, lối lối đồng th i Ví dụ cặp AB EC đồng th i, nh ng AD EB khơng, h ớng giao thông cắt ta dùng s đồ trực quan nh sau: tên c a 13 lối đ ợc viết lên mặt phẳng, hai lối đồng th i x y đụng (t c hai h ớng cắt qua nhau) ta nối l i đo n thẳng, cong, ngoằn ngoèo tuỳ thích Ta có s đồ nh hình I.2 Nh v y, s đồ này, hai lối có c nh nối l i với hai lối cho đồng th i Với cách biểu di n nh v y ta có đồ thị (Graph), t c ta mơ hình hố tốn giao thơng theo mơ hình tốn đồ thị; m i lối tr thành đỉnh c a đồ thị, hai lối đồng th i đ ợc nối đo n ta gọi c nh c a đồ thị Bây gi ta ph i xác định nhóm, với số nhóm nh t, m i nhóm gồm lối đi đồng th i, ng với pha c a đèn hi u điều khiển giao thông Gi sử rằng, ta dùng màu để tô lên đỉnh c a đồ thị cho: - Các lối cho phép đồng th i có màu: D dàng nh n th y hai đỉnh có c nh nối không đ ợc tô màu - Số nhóm nh t: ta ph i tính tốn cho số màu đ ợc dùng nh t Tóm l i, ta ph i gi i toán sau: Cấu trúc liệu thuật giải "Tô màu cho đồ thị hình I.2 cho: - Hai đỉnh có c nh nối với (hai gọi hai đỉnh kề nhau) không màu - Số màu đ ợc dùng nh t." Hai tốn thực tế “tơ màu b n đồ giới” “đèn giao thông” xem r t khác bi t nh ng sau mơ hình hóa, chúng thực ch t một, tốn “tơ màu đồ thị” Đối với tốn đ ợc hình th c hố, tìm kiếm cách gi i thu t ngữ c a mơ hình xác định có hay khơng ch Nếu khơng có ch ng trình có sẵn để gi i ng trình nh v y nh t tìm đ ợc biết mơ hình dùng tính ch t c a mơ hình để xây dựng thu t gi i tốt 1.1.2 Thu t gi i (algorithms) Khi có mơ hình thích hợp cho tốn ta c n cố gắng tìm cách gi i tốn mơ hình Kh i đ u tìm thu t gi i, chu i hữu h n thị (instruction) mà m i thị có ý nghĩa rõ ràng thực hi n đ ợc l ợng th i gian hữu h n Knuth (1973) định nghĩa thu t gi i chu i hữu h n thao tác để gi i toán Các tính ch t quan trọng c a thu t gi i là: - Hữu h n (finiteness): thu t gi i ph i luôn kết thúc sau số hữu h n b ớc Cấu trúc liệu thuật giải - Xác định (definiteness): m i b ớc c a thu t gi i ph i đ ợc xác định rõ ràng ph i đ ợc thực hi n xác, nh t quán - Hi u qu (effectiveness): thao tác thu t gi i ph i đ ợc thực hi n l ợng th i gian hữu h n Ngồi thu t gi i cịn ph i có đ u vào (input) đ u (output) Nói tóm l i, thu t gi i ph i gi i xong công vi c ta cho li u vào Có nhiều cách để thể hi n thu t gi i: dùng l i, dùng l u đồ, Và lối dùng r t ph biến dùng ngôn ngữ mã gi , kết hợp c a ngơn ngữ tự nhiên c u trúc c a ngôn ngữ l p trình Ví dụ: Thiết kế thu t gi i để gi i tốn “ tơ màu đồ thị” Bài tốn tơ màu cho đồ thị khơng có thu t gi i tốt để tìm l i gi i tối u, t c là, khơng có thu t gi i khác h n "thử t t c kh năng" hay "vét c n" t t c tr ng hợp có, để xác định cách tô màu cho đỉnh c a đồ thị cho số màu dùng nh t Thực tế, ta "vét c n" tr tr ng hợp đồ thị có số đỉnh nhỏ, ng hợp ng ợc l i ta "vét c n" t t c kh l ợng th i gian hợp lý, v y ta ph i suy nghĩ cách khác để gi i v n đề: Thêm thông tin vào tốn để đồ thị có số tính ch t đặc bi t dùng tính ch t đặc bi t ta d dàng tìm l i gi i, thay đ i yêu c u tốn cho d gi i quyết, nh ng l i gi i tìm đ ợc ch a l i gi i tối u Một cách làm nh toán "Cố gắng tơ màu cho đồ thị màu nh t cách nhanh chóng" Ít màu nh t có nghĩa số màu mà ta tìm đ ợc không ph i luôn số màu c a l i gi i tối u (ít nh t) nh ng đa số tr ng hợp trùng với đáp số c a l i gi i tối u có chênh l ch "khơng chênh l ch nhiều" so với l i gi i tối u, bù l i ta không ph i "vét c n" kh có thể! Nói khác đi, ta khơng dùng thu t gi i "vét c n" kh để tìm l i gi i tối u mà tìm gi i pháp để đ a l i gi i hợp lý cách kh thi th i gian Một gi i pháp nh HEURISTIC HEURISTIC cho tốn tơ màu đồ thị, th gọi ng gọi thu t gi i "háu ăn" (GREEDY) là: Cấu trúc liệu thuật giải - Chọn đỉnh ch a tơ màu tơ màu C - Duy t danh sách đỉnh ch a tô màu Đối với đỉnh ch a tơ màu, xác định xem có kề với đỉnh đ ợc tô màu C khơng Nếu khơng có, tơ màu C ng c a Heuristic hết s c đ n gi n: dùng màu để tô cho nhiều đỉnh nh t Ýt đ ợc (các đỉnh đ ợc xét theo th tự đó), tô đ ợc với màu dùng dùng màu khác Nh v y ta "hi vọng" số màu c n dùng nh t Ví dụ: Đồ thị hình I.3 cách tơ màu cho Tơ theo GREEDY Tối u (xét l n l ợt theo số th tự đỉnh) (thử t t c kh năng) 1: đỏ; 2: đỏ 1,3,4 : đỏ 3: xanh;4: xanh 2,5 : xanh 5: vàng Rõ ràng cách tô màu thu t gi i "háu ăn" không luôn cho l i gi i tối u nh ng đ ợc thực hi n cách nhanh chóng Tr l i tốn giao thơng áp dụng HEURISTIC Greedy cho đồ thị hình I.2 (theo th tự đỉnh li t kê trên), ta có kết qu : - Tô màu xanh cho đỉnh: AB,AC,AD,BA,DC,ED - Tô màu đỏ cho đỉnh: BC,BD,EA Cấu trúc liệu thuật giải - Chèn nút vào tr ớc ph n tử p Chèn đ u danh sách - void AddFirst(DLIST &l, DNODE* new_ele) - { - if (l.pHead==NULL) //DS rỗng - { - l.pHead = new_ele; - l.pTail = l.pHead; - } - else - { - new_ele->pNext = l.pHead; - l.pHead->pPrev = new_ele; // (2) - l.pHead = new_ele; // (3) - // (1) } } Chèn ph n tử vào cuối danh sách liên kết 113 Cấu trúc liệu thuật giải - void AddTail(DLIST &l, DNODE *new_ele) - { - if (l.pHead==NULL) - { - l.pHead = new_ele; - l.pTail = l.pHead; - } - else - { - l.pTail->Next = new_ele; // (1) - new_ele->pPrev = l.pTail; // (2) - l.pTail = new_ele; // (3) - } } Chèn ph n tử sau ph n tử q danh sách - void AddAfter(DLIST &l, DNODE* q,DNODE* new_ele) - { - DNODE* p = q->pNext; - if ( q!=NULL) - { - new_ele->pNext = p; //(1) - new_ele->pPrev = q; //(2) - q->pNext = new_ele; //(3) - if(p != NULL) p->pPrev = new_ele; //(4) 114 Cấu trúc liệu thuật giải - if(q == l.pTail) l.pTail = new_ele; - } - else //chèn đầu danh sách - AddFirst(l, new_ele); } Chèn ph n tử vào tr ớc ph n tử q danh sách Hình III.10: chèn ph n tử x tr ớc ph n tử q - void AddBefore(DLIST &l, DNODE q, DNODE* new_ele) - { - DNODE* p = q->pPrev; - if ( q!=NULL) - { - new_ele->pNext = q; //(1) - new_ele->pPrev = p; //(2) - q->pPrev = new_ele; //(3) - if(p != NULL) p->pNext = new_ele; //(4) - if(q == l.pHead) l.pHead = new_ele; - } - else //chèn vào cuối danh sách - AddTail(l, new_ele); } H y ph n tử khỏi danh sách Có thao tác thông dụng để h y ph n tử khỏi danh sách liên kết kép 115 Cấu trúc liệu thuật giải - H y ph n tử đ u danh sách - H y ph n tử đ u danh sách - H y ph n tử sau ph n tử q - H y ph n tử tr ớc ph n tử q - H y ph n tử có khóa k H y ph n tử đ u xâu - Data RemoveHead(DLIST &l) - { - DNODE *p; - Data x = NULLDATA; - if ( l.pHead != NULL) - { - p = l.pHead; x = p->Info; - l.pHead = l.pHead->pNext; - l.pHead->pPrev = NULL; - delete p; - if(l.pHead == NULL) l.pTail = NULL; - else l.pHead->pPrev = NULL; - } - return x; - } H y ph n tử cuối xâu - Data RemoveTail(DLIST &l) - { - DNODE *p; - Data x = NULLDATA; - if ( l.pTail != NULL) - { 116 Cấu trúc liệu thuật giải - p = l.pTail; x = p->Info; - l.pTail = l.pTail->pPrev; - l.pTail->pNext = NULL; - delete p; - if(l.pHead == NULL) l.pTail = NULL; - else l.pHead->pPrev = NULL; - } - return x; - } H y ph n tử đ ng sâu ph n tử q - Data RemoveTail(DLIST &l) - { - DNODE *p; - Data x = NULLDATA; - if ( l.pTail != NULL) - { - p = l.pTail; x = p->Info; - l.pTail = l.pTail->pPrev; - l.pTail->pNext = NULL; - delete p; - if(l.pHead == NULL) l.pTail = NULL; - else l.pHead->pPrev = NULL; - } - return x; - } H y ph n tử đ ng truớc ph n tử q - void RemoveBefore (DLIST &l, DNODE *q) - { 117 Cấu trúc liệu thuật giải - DNODE *p; - if ( q != NULL) - { - p = q ->pPrev; - if ( p != NULL) - { - q->pPrev = p->pPrev; - if(p == l.pHead) l.pHead = q; - else p->pPrev->pNext = q; - delete p; - } - } - else - RemoveTail(l); } H y ph n tử có khóa k - int RemoveNode(DLIST &l, Data k) - { - DNODE *p = l.pHead; - NODE *q; - while( p != NULL) - { - if(p->Info == k) break; - p = p->pNext; - } - if(p == NULL) return 0; //Khơng tìm k - q = p->pPrev; - if ( q != NULL) 118 Cấu trúc liệu thuật giải - { - p = q ->pNext ; - if ( p != NULL) - { - q->pNext = p->pNext; - if(p == l.pTail) l.pTail = q; - else p->pNext->pPrev = q; - } - } - else //p phần tử đầu danh sách - { - l.pHead = p->pNext; - if(l.pHead == NULL) l.pTail = NULL; - else l.pHead->pPrev = NULL; - } - delete p; - return 1; - } S p x p danh sách liên k t kép Vi c xếp danh sách liên kết kép c b n khơng khác danh sách liên kết đ n Ta c n l u ý điều nh t c n b o toàn mối liên kết hai chiều xếp Ví dụ: cài đặt thu t tốn xếp QuickSort - void - { DListQSort(DLIST & l) // X đến phần tử cầm canh - DNODE *p, *X; - DLIST l1, l2; - if(l.pHead == l.pTail) return;//đã có thứ tự 119 Cấu trúc liệu thuật giải - l1.pHead == l1.pTail = NULL; //khởi tạo - l2.pHead == l2.pTail = NULL; - X = l.pHead; l.pHead = X->pNext; - while(l.pHead != NULL) //Tách l thành l1, l2; - { - p = l.pHead; - l.pHead = p->pNext; p->pNext = NULL; - if (p->Info Info) AddTail(l1, p); - else AddTail(l2, p); - } - DListQSort(l1); //Gọi đệ qui để l1 - DListQSort(l2); //Gọi đệ qui để l2 - //Nói l1, X, l2 thành l - if(l1.pHead != NULL) - { - l.pHead = l1.pHead; l1.pTail->pNext = X; - X->pPrev = l1.pTail; - } - else l.pHead = X; - X->pNext = l2; - if(l2.pHead != NULL) - { - l.pTail = l2.pTail; - l2->pHead->pPrev = X; - } - else l.pTail = X; - } Nh n xét 120 Cấu trúc liệu thuật giải Xâu kép co b n có tính ch t giống nh xâu đ n, nhiên cómột số tính ch t khác nh sau: - Xâu kép có mối liên kết hai chiều nên từ ph n tử b t kì truy xu t ph n tử b t kì khác Trong xâu đ n ta truy xu t đến ph n tử đ ng sau ph n tử cho tr ớc Điều d n đến vi c ta d dàng h y ph n tử cuối xâu kép, xâu đ n thao tác tốnchi phí O(n) - Bù l i, xâu kép tốn chi phí g p đôi so với xâu đ n cho vi c l u trữ mối liên kết Điều khiến vi c c p nh t nặng nề h n số tr ng hợp Nh v y ta c n cân nhắc lựa chọn CTDL hợp lý cài đặtcho ng dụng cụ thể Bài t p: Bài 1: Kiểu Data định nghĩa sau: struct Data { char HoTen[30]; double Luong; 121 Cấu trúc liệu thuật giải char CMND[15]; } ch Viết ch ng trình thực hi n thao tác danh sách liên kết đ n Yêu c u c a ng trình : - In hình menu có ch c sau : Xu t li u c a danh sách hình Kiem tra danh sách r ng hay khơng? 3, Đ o ng ợc danh sách cho Tìm ph n tử danh sách Chèn ph n tử vào danh sách H y ph n tử khỏi danh sách Đếm số nút c a danh sách Copy danh sách cho sang danh sách khác Tách l n l ợt nút c a danh sách l sang danh sách đ n l1, l2 10 Tách danh sách l sang danh sách đ n l1, l2 l1 ch a nửa số nút đ u c a l, l2 ch a nút l i 11 Sắp xếp tăng d n danh sách liên kết theo khóa l ng 12 Thốt t - Nh p li u cho danh sách , muốn thực hi n thao tác chọn ch c ng ng c a menu Bài 2: Viết ch ng trình thực hi n phép tốn t p hợp (t p hợp đ ợc cài đặt danh sách liên kết đ n) Yêu c u c a ch ng trình : 122 Cấu trúc liệu thuật giải - In hình menu có ch c sau: Xem t p hợp Tính hợp t p hợp Tính giao t p hợp Kiểm tra ph n tử có thuộc vào t p hợp Tính A\B Tính hi u đối x ng t p hợp: (A\B)U(B\A) Tính lực l ợng t p hợp Thoát - Nh p li u cho t p hợp, muốn thực hi n thao tác chọn ch c t ng c a menu ng Bài 3: Viết ch ng trình thực hi n phép toán Đa th c (dùng danh sách liên kết đ n l u trử h số khác số mũ t ng ng) Yêu c u c a ch ng trình : - In hình menu có ch c sau: Xu t đa th c hình Cộng đa th c Trừ đa th c Nhân đa th c Tính giá trị cuta đa th c t i x Thoát - Nh p li u cho t p hợp, muốn thực hi n thao tác chọn ch c t ng c a menu ng Bài 4: Viết ch ng trình thực hi n thao tác Stack Yêu c u c a ch ng trình : 123 Cấu trúc liệu thuật giải - In hình menu có ch c sau : Xu t li u c a Stack hình Kiem tra Stack r ng hay không? 3, Xem đỉnh c a Stack Tìm ph n tử Stack Thêm ph n tử vào đ u Stack H y ph n tử đ u khỏi Stack Đếm số nút c a Stack Copy Stack cho sang Stack khác Thoát - Nh p li u cho Stack , muốn thực hi n thao tác chọn ch c t ng c a menu ng Bài 5: ng dụng c u trúc li u Stack, viết ch sang h ng trình đ i số nguyên d ng h 10 Bài 6: Viết ch ng trình thực hi n thao tác Queue (cài đặt danh sách liên kết đ n).Yêu c u c a ch ng trình : - In hình menu có ch c sau : Xu t li u c a Queue hình Kiem tra Queue r ng hay khơng? Tìm ph n tử Queue Thêm ph n tử vào cuối Queue H y ph n tử đ u khỏi Queue Đếm số nút c a Queue 124 Cấu trúc liệu thuật giải Thoát - Nh p li u cho Queue , muốn thực hi n thao tác chọn ch c t ng c a menu ng Bài 7: Viết ch ng trình thực hi n thao tác danh sách liên kết vòng (đ n) Yêu c u c a ch ng trình : - In hình menu có ch c sau : Xu t li u c a danh sách hình Kiem tra danh sách r ng hay khơng? Tìm ph n tử danh sách Chèn ph n tử vào danh sách H y ph n tử khỏi danh sách Thoát t - Nh p li u cho danh sách , muốn thực hi n thao tác chọn ch c ng ng c a menu Bài (Bài toán Josephus): Một nhóm binh sĩ bị kẻ thù bao vây binh sĩ đ ợc chọn để c u c u Vi c chọn đ ợc thực hi n theo cách sau đây: “ Một số nguyên n binh sĩ đ ợc chọn ng u nhiên Các binh sĩ đ ợc theo vòng tròn họ đếm từ binh sĩ đ ợc chọn ng u nhiên Khi đ t đến n, binh sĩ t ng ng đ ợc l y khỏi vòng vi c đếm l i đ ợc bắt đ u từ binh sĩ Quá trình tiếp tục l i binh sĩ đ ợc chọn để c u c u” Hãy viết thu t toán cài đặt cách chọn này, dùng danh sách liên kết vòng để l u trữ tên c a binh sĩ 125 Cấu trúc liệu thuật giải 126 Cấu trúc liệu thuật giải TÀI LI U THAM KH O [1] ALFRED V AHO & JOHN E.HOPCROFT & JOHN D ULMANN (1983), “Data structures and algorithms”, Addison Wesley [2] LARRY NYHOFF & SANFORD LESSTMA, “L p trình nâng cao Passcal với c u trúc li u” (b n dịch: Lê Minh Trung (1997)) [3] NIKLAUS WIRTH, “Algorithms + data structures = Programs”, Prentice-Hall INC (B n dịch c a Nguy n Quốc C ng (1983)) [4] S.E.GOODMAN & S.T HEDETNIEMI (1977), “Introduction to the design and analysis of algorithms”, Mcgraw-Hill [5] TR N H NH NHI (1997), “C u trúc li u”, Trung tâm phát triển Công ngh thơng tin t.p Hồ Chí Minh [] TR NG CHÍ TÍN (2000), “C u trúc li u thu t gi i 1”, Đ i học Đà L t []Đ XUÂN LÔI (1995), “C u trúc li u gi i thu t”, Nhà xu t b n Khoa học Kỹ thu t, Hà Nội 127