|
|||||||
![]() |
|
|
|
Các công cụ đề tài | Các chế độ hiển thị |
|
#1
|
||||
|
||||
Ngăn xếp và hàng đợi (Stack and Queue) - Nguyên tắc và cài đặt trên C++
Thứ nhất về stack.
Stack là gì: stack là một kiểu dữ liệu trừu tượng, một cấu trúc có nhiều nút giống như List vậy (Danh sách liên kết) nhưng chúng ta chỉ được phép thêm nút mới vào đỉnh stack (tác vụ push) hoặc xóa nut ở đỉnh stack (tác vụ Pop), hay chúng ta còn gọi cơ chế của stack là cơ chế Lifo (vào trước ra sau). Bạn cứ hình dung stack như một cái băng đạn mỗi nút là một viên đạn, viên đạn nào vào trước thì ra sau, viên nào vào sau thì ra trước. OK Còn stack để làm gì ư. Stack để giải quyết những vấn đề theo cơ chế LIFO như chuyển một biểu thức dạng trung tố về hậu tố. Sau đây là mô hình cho Stack-ADT 1. Mô tả dữ liệu:
initialize Chức năng: Khởi động stack Dữ liệu nhập: Không Dữ liệu xuất: stack top về vị trí khởi đầu. empty: Chức năng kiểm tra stack có bị rỗng không. Dữ liệu nhập: Không Dữ liệu xuất: True or False (True: khi stack rỗng, False: stack không bị rỗng). pusth Chức năng: thêm nút mới tại đỉnh stack Dữ liệu nhập: nút mới. Dữ liệu xuất: không pop Chức năng: xóa nút tại đỉnh stack. Dữ liệu nhập: Không. Điều kiện: stack không bị rỗng. Dữ liệu xuất: nút bị xóa. Stacktop: Chức năng: truy xuất nút tại đỉnh stack. Dữ liệu nhập: Không. Điều kiện: stack không bị rỗng. Dữ liệu xuất: nút tại đỉnh stack. Stacksize Chức năng: xác định số nút hiện có trong stack. Dữ liệu: Không. Dữ liệu xuất: số nút hiện có trong stack. Clearstack: Chức năng: xóa tất cả các nút ở trong stack. Dữ liệu nhập: không. Dữ liệu xuất:stack top về vị trí khởi đầu. copystack: Chức năng: copystack thành stack thành stack mới. Dữ liệu nhập: stack nguồn. Dữ liệu xuất: stack đích giống stack nguồn. Phương pháp cài đặt stack Có rất nhiều cách cài đặt một stack nhưng đơn giản cũng như để dễ hình dung nhất là cài đặt bằng mảng hay còn gọi là cài đặt theo kiểu kế tiếp. Ngoài ra còn nhiều cách cài đặt khác như cài đặt bằng Danh sách liên kết (DSLK đơn, DSLK vòng, DSLK kép, DSLK vòng+kép mình thấy cài đặt bằng DSLK vòng +kép là hay nhất) Sau đây mình sẽ giới thiệu cho bạn về cách cài đặt một stack theo kiểu kế tiếp (bằng mảng đó) minh họa bằng ngôn ngữ C++ C++ Code:
Không hiểu gì thì cứ post bài ở tại topic này hoặc liên hệ qua nick Yahoo của mình. Còn Queue (hay còn gọi là hàng đợi) để tối mình viết nốt. Giờ bận xíu
|
|
#2
|
||||
|
||||
Hàng đợi (Queue)
Hàng đợi (Queue)
[/B]Cũng tương tự như stack, Quêu là một cấu trúc có nhiều nút trải dài từ đầu hàng đợi đến cuối hàng đợi - với hàng đợi chúng ta chỉ được phép thêm nút vào cuối hàng đợi và xóa nút ở đầu hàng đợi nghĩa là việc truy xuất các nút trên hàng đợi xảy ra ở cả hai đầu. Vì nút thêm vào trước sẽ được lấy ra trước nên cấu trúc hàng đợi còn được gọi là cấu trúc FIFO (Firt In First Out). Ví dụ như bạn đi mua vé xem phim với người iu chẳng hạn thì người mua xếp hàng trước sẽ được mua vé trước còn người mua xếp hàng sau thì sẽ mua vé sau. Và hàng đợi để làm gì ???: Hàng đợi để giải quyết những vấn đề có cơ chế FIFO như dịch vụ quản lý kho, dịch vụ ngân hàng .... Và sau đây là mô hình Queue-ADT 1. Mô tả dữ liệu: Có nhiều nút cùng kiểu dữ liệu. Có đầu hàng đợi (front) và cuối hàng đợi (tail) 2. Mô tả các tác vụ trên hàng đợi: initialize: Chức năng: Khởi động hàng đợi. Dữ liệu nhập: không. Dữ liệu xuất: front và tail được gán giá trị phù hợp. empty: Chức năng: Kiểm tra hàng đợi có bị rỗng không. Dữ liệu nhập: không. Dữ liệu xuất True or False. (true khi hàng đợi rỗng, false khi hàng đợi không rỗng) insert: Chức năng: thêm nút mới vào cuối hàng đợi. Dữ liệu nhập: nút mới. Điều kiện: hàng đợi không bị đầy. Dữ liệu xuất: không. remove: Chức năng: xóa nút ở đầu hàng đợi. Dữ liệu nhập: không. Điều kiện: hàng đợi không bị rỗng. Dữ liệu xuất: nút bị xóa. queuefront: Chức năng truy xuất nút ở đầu hàng đợi. Dữ liệu nhập: không. Điều kiện: hàng đợi không bị rỗng. Dữ liệu xuất: nút tại đầu hàng đợi. queuetail: Chức năng truy xuất nút tại cuối hàng đợi. Dữ liệu nhập: không. Điều kiện: hàng đợi không bị rỗng. Dữ liệu xuất: nút tại cuối hàng đợi. queue size: Chức năng: xác định số nút hiện có trong hàng đợi. Dữ liệu nhập: không. Dữ liệu xuất:số nút có trong hàng đợi. clearqueue: Chức năng: xóa tất cả các nút có trong hàng đợi. Dữ liệu nhập: không. Dữ liệu xuất: front và tail với giá trị phù hợp. Các phương pháp cài đặt Queue-ADT Cũng như stack chúng ta cài đặt hàng đợi theo hai cách là cài đặt kiểu kế tiếp (dùng mảng 1 chiều hoặc dùng mảng vòng) và cài đặt kiểu liên kết (dùng DSLK đơn, vòng, kép, kép+vòng và giống như stack thì cài đặt bằng DSLK kép+vòng là hay nhất). Để đơn giản và dễ hiểu nhất thì tớ sẽ cài đặt bằng mảng 1 chiều. Minh họa bằng ngôn ngữ C++ C++ Code:
Đã được chỉnh sửa lần cuối bởi iamvtn : 23-11-2007 lúc 11:01 PM. |
|
#3
|
||||
|
||||
|
Mình có chút thắc mắc:
Giả sử stack có a[0],a[1].......................a[n] phần tử. Khi bạn gắn: top=-1; có phải nó tương ứng với a[1]? Mình thấy khi check stack của bạn là: top=max -1; => danh sách đầy. Nếu mình gắn: top=1; thì khi: top=max; => danh sách đầy??? Giải thích giúp mình nhá Đã được chỉnh sửa lần cuối bởi iamvtn : 24-11-2007 lúc 01:29 PM. |
|
#4
|
||||
|
||||
|
Trích dẫn:
Mình có chút thắc mắc:
Giả sử stack có a[0],a[1].......................a[n] phần tử. Khi bạn gắn: top=-1; có phải nó tương ứng với a[1]? Mình thấy khi check stack của bạn là: top=max -1; => danh sách đầy. Nếu mình gắn: top=1; thì khi: top=max; => danh sách đầy??? Giải thích giúp mình nhá. Đã được chỉnh sửa lần cuối bởi iamvtn : 27-11-2007 lúc 10:25 AM. |
|
#5
|
||||
|
||||
Sử dụng stack để đổi cơ số.
Sử dụng stack để đổi cơ số.
C++ Code:
|
|
#6
|
||||
|
||||
|
Cho em hỏi nếu mình khai báo stack như sau:
C Code:
thì destructor mình viết hàm inline C Code:
hay là viết như vầy: (em nghĩ viết như cách này mới đúng) C Code:
Chúc mừng anh zkday lên chức
Đã được chỉnh sửa lần cuối bởi trunkthai : 23-09-2008 lúc 11:57 AM. |
|
#7
|
||||
|
||||
|
Đây là stack tớ cài, chắc sẽ giải quyết được vấn đề của cậu :
C++ Code:
__________________
What you see is never what you get... Đã được chỉnh sửa lần cuối bởi Tab : 23-09-2008 lúc 12:12 PM. |
|
#8
|
||||
|
||||
|
Cám on anh void main,giờ mới thấy mình bị điên,con trỏ stack chỉ cấp phat 1 lần lúc khởi động để làm nhiệm vụ truy cập các phtu của stack thôi.
Không hiểu sao mình dám viết destructor thế kia.. .Cám ơn mấy anh
|
|
#9
|
||||
|
||||
|
Code voidmain() có rất nhiều lỗi logic, code không safe. Ví dụ constructor chẳng hạn.
Cấp phát size = s nhưng nội dung = undefined. -> giả nếu r2 gọi Pop() thì sao ? Cả pop lẫn top đều phải bắt buộc kiểm tra range. Hàm push mắc lỗi nghiêm trọng : DANGLING POINTER !
__________________
The best C++ library ever! http://www.boost.org/ |
|
#10
|
||||
|
||||
|
Tất nhiên , đây là code tớ phác thử , với việc gọi Pop , đúng ra phải kiểm tra Empty , nếu không kiểm tra Empty , giá trị trả về sẽ là 1 giá trị chưa được định nghĩa .
Còn hàm Push, tớ ko hiểu lỗi RR nói , có thể chỉ rõ hơn đc ko ?
__________________
What you see is never what you get... |
![]() |
|
|
| Bookmarks |
| Các công cụ đề tài | |
| Các chế độ hiển thị | |
|
|
Các đề tài tương tự
|
||||
| Đề tài | Người bắt đầu đề tài | Diễn đàn | Các trả lời | Bài viết cuối |
| Xây dựng lớp stack cho ngăn xếp kiểu int | hoaxuyenchi | Thắc mắc lập trình C/C++/C++0x | 9 | 14-10-2012 09:53 PM |
| Stack, ngăn xếp - Thiết lập và ứng dụng stack trong C | PoPoPoPo | Thủ thuật, Tutorials CTDL & Giải thuật | 8 | 15-11-2010 11:24 PM |