Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 58 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
58
Dung lượng
538,61 KB
Nội dung
Chương 3.2. Ngăn xếp & Hàng đợi Trần Minh Thái Email: minhthai@itc.edu.vn Website: www.minhthai.edu.vn 1 Nội dung Trình bày khái niệm Ngăn xếp (Stack) và Hàng đợi (Queue) Minh họa các ứng dụng Các phương pháp xây dựng Stack và Queue 2 Khái niệm Stack 3 Khái niệm Stack Gồm nhiều phần tử Hoạt động theo cơ chế “Vào sau – Ra trước” (LIFO – Last In, First Out) Đỉnh ngăn xếp 4 Thao tác cơ bản trên Stack InitStack: khởi tạo Stack rỗng IsEmpty: kiểm tra Stack rỗng? IsFull: kiểm tra Stack đầy? Push: thêm 1 phần tử vào Stack Pop: lấy ra 1 phần tử khỏi Stack Push Pop 5 Thao tác Push vào Stack 6 Top PUSH Thao tác Pop khỏi stack 7 Top P O P Cách xây dựng Stack 8 Mảng 1 chiều Danh sách liên kết Viết chương trình dễ dàng, nhanh chóng Bị hạn chế do số lượng phần tử cố định Tốn chi phí tái cấp phát và sao chép vùng nhớ nếu sử dụng mảng động Phức tạp khi triển khai chương trình Không bị cố định về số phần tử, phụ thuộc vào bộ nhớ Stack – Sử dụng mảng 9 3 6 9 3 6 0 1 2 3 4 5 6 7 8 9 Stack Top 9 Stack số nguyên – Sử dụng mảng struct ttStack { int* StkArray; // mảng chứa các phần tử int StkMax; // số phần tử tối đa int StkTop; // vị trí đỉnh Stack }; typedef struct ttStack STACK; 10 [...]... phân hoạch từ stack Chọn phần tử trục trên phân hoạch này Điều chỉnh phân hoạch tương ứng với trục Push 2 phân hoạch bên trái và phải trục vào stack Stack rỗng t Stop 1 3 5 4 5 7 7 5 3 0 1 2 3 4 (3 ,4) (0 ,4) (0,1) i j 29 Queue Phòng vé 30 Queue – Định nghĩa Hàng đợi là một cấu trúc: Gồm nhiều phần tử có thứ tự Hoạt động theo cơ chế “Vào trước, ra trước” (FIFO - First In First Out) 31 Queue – Định... thao tác trên stack STACK s; InitStack(s); StkCnt StkTop N Push(s, 7); 4 7 Push(s, 4) ; Data Pop(s, x); // x = ? 21 Link Stack số nguyên – Sử dụng DSLK void InitStack (STACK &s) { s.StkTop = NULL; s.StkCount = 0; } 22 Stack số nguyên – Sử dụng DSLK bool IsEmpty(const STACK &s) { if (s.StkTop == NULL) return true; return false; } 23 Stack số nguyên – Sử dụng DSLK bool IsFull (const STACK s) { STACK_ NODE*... 4 4 Data 18 Link Stack – Sử dụng DSLK Cấu tạo đầu stack stack StkCnt StkCnt StkTop StkTop end stack N Cấu tạo một phần tử node Data Link end node Data Link 19 Stack số nguyên – Sử dụng DSLK typedef struct tagSTACK_NODE { int Data; tagSTACK_NODE *pNext; } STACK_ NODE; typedef struct STACK { int StkCount; STACK_ NODE *StkTop; }; 20 Stack – Sử dụng DSLK... một stack để lưu lại các partition (phân hoạch) cần tiến hành sắp xếp Ý tưởng: Push phân hoạch đầu tiên (0, n-1) vào stack Trong khi stack chưa rỗng Pop một phân hoạch từ stack Chọn phần tử trục trên phân hoạch này Điều chỉnh phân hoạch tương ứng với trục Push 2 phân hoạch bên trái và phải trục vào stack 28 Stack – Quick Sort Push phân hoạch đầu tiên (0, n-1) vào stack Trong khi stack. .. 13 Stack số nguyên – Sử dụng mảng bool Push (STACK &s, int newitem) { if (IsFull(s)) return false; s.StkTop++; s.StkArray[s.StkTop] = newitem; return true; } 14 Stack số nguyên – Sử dụng mảng bool Pop (STACK &s, int &outitem) { if (IsEmpty(s)) return false; outitem = s.StkArray[s.StkTop]; s.StkTop ; return true; } 15 Bài tập Viết hàm nhập và xuất Stack số nguyên Khai báo cấu trúc và viết hàm tạo Stack. .. hàng đợi: InitQueue: khởi tạo hàng đợi rỗng IsEmpty: kiểm tra hàng đợi rỗng? IsFull: kiểm tra hàng đợi đầy? EnQueue: thêm 1 phần tử vào cuối hàng đợi, có thể làm hàng đợi đầy DeQueue: lấy ra 1 phần tử từ đầu Queue, có thể làm Queue rỗng 32 Queue Minh họa thao tác EnQueue Minh họa thao tác DeQueue 33 Cách xây dựng Queue Sử dụng mảng một chiều Sử dụng danh sách liên kết đơn 34 Queue – Sử dụng... phần tử Stack là ký tự) Khai báo cấu trúc và viết hàm tạo Stack từ chuỗi ký tự str (mỗi phần tử Stack là một từ - từ cách nhau bởi khoảng trắng) 16 Stack – Ví dụ ứng dụng Kiểm tra sự tương ứng của các cặp ngoặc đơn trong một biểu thức ( ( A + B ) / C Đảo ngược một chuỗi ký tự ? Cá Ăn Kiến ( A + B ) / C) nếiK nĂ áC ? 17 Stack – Sử dụng DSLK StkCnt StkTop N 7 7 Data Link 9 9 Data Link 4 4 Data... STACK_ NODE* temp = new STACK_ NODE; if (temp == NULL) return true; delete temp; return false; } 24 Stack số nguyên – Sử dụng DSLK bool Push (STACK &s, int newitem) { if (IsFull(s)) return false; STACK_ NODE *pNew = new STACK_ NODE; StkCnt StkTop N pNew->Data = newitem; pNew->pNext = s.StkTop; 4 7 s.StkTop = pNew; Data s.StkCount++; return true; } 25 Link Stack số nguyên – Sử dụng DSLK bool Pop (STACK &s, int &outitem)... (IsEmpty(s)) return false; STACK_ NODE *temp = s.StkTop; StkCnt StkTop temp N outitem = s.StkTop->Data; 4 s.StkTop = s.StkTop->pNext; Data delete temp; Link s.StkCount ; return true; 7 } Data outitem = 4 26 Link Stack – Ứng dụng Stack có nhiều ứng dụng: Lưu vết trong thuật toán “back-tracking” (theo dõi dấu vết) Tính giá trị biểu thức toán học (thuật toán Balan ngược) Khử đệ quy … 27 Stack – Quick Sort.. .Stack số nguyên – Sử dụng mảng bool InitStack (STACK& s, int MaxItems) { s.StkArray = new int[MaxItems]; if (s.StkArray == NULL) return false; s.StkMax = MaxItems; s.StkTop = -1; return true; } 11 Stack số nguyên – Sử dụng mảng bool IsEmpty(const STACK &s) { if (s.StkTop==-1) return true; return false; } 12 Stack số nguyên – Sử dụng mảng bool IsFull(const STACK &s) { if (s.StkTop==s.StkMax-1) . Stack InitStack: khởi tạo Stack rỗng IsEmpty: kiểm tra Stack rỗng? IsFull: kiểm tra Stack đầy? Push: thêm 1 phần tử vào Stack Pop: lấy ra 1 phần tử khỏi Stack Push Pop 5 Thao tác Push vào Stack 6 Top PUSH Thao. dựng Stack và Queue 2 Khái niệm Stack 3 Khái niệm Stack Gồm nhiều phần tử Hoạt động theo cơ chế “Vào sau – Ra trước” (LIFO – Last In, First Out) Đỉnh ngăn xếp 4 Thao tác cơ bản trên Stack InitStack:. nguyên Khai báo cấu trúc và viết hàm tạo Stack từ chuỗi ký tự str (mỗi phần tử Stack là ký tự) Khai báo cấu trúc và viết hàm tạo Stack từ chuỗi ký tự str (mỗi phần tử Stack là một từ - từ cách