Trong lĩnh vực Công Nghệ Thông Tin nói riêng, yêu cầu quan trọng nhất của người học đó chính là thực hành. Có thực hành thì người học mới có thể tự mình lĩnh hội và hiểu biết sâu sắc với lý thuyết. Với ngành mạng máy tính, nhu cầu thực hành được đặt lên hàng đầu. Tuy nhiên, trong điều kiện còn thiếu thốn về trang bị như hiện nay, người học đặc biệt là sinh viên ít có điều kiện thực hành. Đặc biệt là với các thiết bị đắt tiền như Router, Switch chuyên dụng
Chương 5: NGĂN XẾP – HÀNG ĐỢI (Stack - Queue) NỘI DUNG Ngăn xếp (Stack) Hàng đợi (Queue) Chương 5: Ngăn xếp – Hàng đợi NỘI DUNG Ngăn xếp (Stack) Khái niệm Stack Các thao tác Stack Hiện thực Stack Ứng dụng Stack Chương 5: Ngăn xếp – Hàng đợi STACK - KHÁI NIỆM Stack danh sách mà đối tượng thêm vào lấy đầu danh sách (A stack is simply a list of elements with insertions and deletions permitted at one end) Vì thế, thao tác Stack thực theo chế LIFO (Last In First Out - Vào sau trước) Chương 5: Ngăn xếp – Hàng đợi STACK – CÁC THAO TÁC Stack hỗ trợ thao tác chính: Push: Pop: Thêm đối tượng vào Stack Lấy đối tượng khỏi Stack Ví dụ: 523 Stack hỗ trợ số thao tác khác: isEmpty(): Kiểm tra xem Stack có rỗng khơng Top(): Trả giá trị phần tử nằm đầu Stack mà khơng hủy khỏi Stack Nếu Stack rỗng lỗi xảy Chương 5: Ngăn xếp – Hàng đợi STACK – HIỆN THỰC STACK (IMPLEMENTATION OF A STACK) Mảng chiều Kích thước stack thiếu, lúc thừa Push / Pop phức tạp Chương 5: Ngăn xếp – Hàng đợi Danh sách LK Cấp phát động! Push/Pop dễ dàng HIỆN THỰC STACK DÙNG MẢNG (IMPLEMENTATION OF A STACK USING ARRAY) Có thể tạo Stack cách khai báo mảng chiều với kích thước tối đa N (ví dụ: N =1000) Stack chứa tối đa N phần tử đánh số từ đến N-1 Phần tử nằm đỉnh Stack có số top Như vậy, để khai báo Stack, ta cần mảng chiều, biến số nguyên top cho biết số đỉnh Stack: struct Stack { DataType list[N]; int top; }; Chương 5: Ngăn xếp – Hàng đợi HIỆN THỰC STACK DÙNG MẢNG (TT.) (IMPLEMENTATION OF A STACK USING ARRAY) Các hàm cần cài đặt: Init( Stack &s ): Khởi tạo Stack isEmpty( Stack s ) Push( Stack &s , DataType x ) Pop( Stack &s ) Top( Stack &s ) Khi cài đặt mảng chiều, Stack bị giới hạn kích thước nên cần xây dựng thêm thao tác phụ cho Stack: isFull(): Kiểm tra xem Stack có đầy chưa, Stack đầy, việc gọi đến hàm Push() bị lỗi Chương 5: Ngăn xếp – Hàng đợi HIỆN THỰC STACK DÙNG MẢNG (TT.) (IMPLEMENTATION OF A STACK USING ARRAY) Khởi tạo Stack: Chương 5: Ngăn xếp – Hàng đợi HIỆN THỰC STACK DÙNG MẢNG (TT.) (IMPLEMENTATION OF A STACK USING ARRAY) Kiểm tra Stack có rỗng hay khơng: Rỗng: hàm trả Ngược lại: hàm trả 10 Chương 5: Ngăn xếp – Hàng đợi HIỆN THỰC QUEUE DÙNG MẢNG (IMPLEMENTATION OF A QUEUE USING ARRAY) Các hàm cần cài đặt: Init(Queue &q) isEmpty(Queue q) EnQueue(Queue &q, DataType x) DeQueue(Queue &q) Front(Queue q) Do cài đặt mảng chiều, Queue bị giới hạn kích thước nên cần xây dựng thêm thao tác phụ: isFull(): Kiểm tra xem Queue có đầy chưa 68 Chương 5: Ngăn xếp – Hàng đợi HIỆN THỰC QUEUE DÙNG MẢNG (IMPLEMENTATION OF A QUEUE USING ARRAY) Khởi tạo Queue: void { Init(Queue &q) } Kiểm tra xem Queue có rỗng khơng: int isEmpty(Queue q) { if ( q.front==q.rear && q.rear==0 ) return 1; if (q.front == q.rear) return 1; return 0; } Chương 5: Ngăn xếp – Hàng đợi 69 HIỆN THỰC QUEUE DÙNG MẢNG (IMPLEMENTATION OF A QUEUE USING ARRAY) Kiểm tra xem Queue có đầy hay khơng: int isFull(Queue q) { if (q.front == q.rear) return 1; return 0; } 70 Chương 5: Ngăn xếp – Hàng đợi HIỆN THỰC QUEUE DÙNG MẢNG (IMPLEMENTATION OF A QUEUE USING ARRAY) Giải trường hợp điều kiện Queue đầy rỗng: Khơng để Queue đầy Tăng kích thước mảng thêm mà khơng cịn chỗ Định nghĩa thêm biến để tính số phần tử hành Queue (NumElements) Mỗi thêm pt vào Queue NumElements++ Mỗi lấy pt khỏi Queue NumElements— Queue rỗng (front = rear NumElements=0) Queue đầy (front = rear NumElements!=0) Chương 5: Ngăn xếp – Hàng đợi 71 HIỆN THỰC QUEUE DÙNG MẢNG (IMPLEMENTATION OF A QUEUE USING ARRAY) Thêm phần tử x vào cuối Queue: int { EnQueue(Queue &q, DataType x) if (isFull(q)) return 0; // khơng thêm Queue đầy } 72 Chương 5: Ngăn xếp – Hàng đợi HIỆN THỰC QUEUE DÙNG MẢNG (IMPLEMENTATION OF A QUEUE USING ARRAY) Lấy phần tử khỏi Queue: DataType DeQueue(Queue &q) { if (isEmpty(q)){ cout