Bài giảng Cấu trúc dữ liệu và giải thuật – Bài 9: Ngăn xếp - Stacks thông tin đến các bạn kiến thức về khái niệm về stacks, các thao tác chính của stacks, các thao tác khác của stacks.
Cấu trúc liệu giải thuật Bài 9: Ngăn xếp - Stacks Giảng viên: TS Ngo Huu Phuc Tel: 0438 326 077 Mob: 098 5696 580 Email: ngohuuphuc76@gmail.com PhD Ngo Huu Phuc, Le Quy Don Technical University Bài Ngăn xếp Nội dung: 9.1 Khái niệm stacks (7) 9.2 Các thao tác stacks (9) 9.3 Các thao tác khác stacks (9) Tham khảo: Data structures and Algorithms Stacks.htm Kyle Loudon Mastering Algorithms, Chapter Stacks and Queues Elliz Horowitz – Fundamentals of Data Structures, Chapter Stacks and Queues Deshpande Kakle – C and Data Structures, Chapter 19 Stacks and Queues Bài giảng TS Nguyễn Nam Hồng PhD Ngo Huu Phuc, Le Quy Don Technical University 9.1 Khái niệm stacks (1/7) Có thể hình dung stack chồng đĩa Với chồng đĩa này, nhìn thấy đĩa cùng, đĩa cịn lại chưa nhìn thấy Khi thêm đĩa vào chồng đĩa (pushed), đĩa đỉnh stack, nhìn thấy Khi lấy di đĩa từ stack (popped), sử dụng đĩa này, đĩa trở thành đỉnh stack PhD Ngo Huu Phuc, Le Quy Don Technical University 9.1 Khái niệm stacks (2/7) PhD Ngo Huu Phuc, Le Quy Don Technical University 9.1 Khái niệm stacks (3/7) Nguyên lý stack Last In First Out (LIFO), có nghĩa vào sau trước Với nguyên lý đó, có đĩa stack nhìn thấy Muốn nhìn thấy đĩa thứ 3, cần lấy khỏi stack đĩa thứ thứ PhD Ngo Huu Phuc, Le Quy Don Technical University 9.1 Khái niệm stacks (3/7) PhD Ngo Huu Phuc, Le Quy Don Technical University 9.1 Khái niệm stacks (4/7) Có thao tác stack: Push Đưa phần tử vào đỉnh stack Pop Lấy từ đỉnh stack phần tử Peek Xem đỉnh stack chứa nội dung gì? PhD Ngo Huu Phuc, Le Quy Don Technical University Push Pop 9.1 Khái niệm stacks (5/7) Một số ứng dụng stack: Ứng dụng trực tiếp: Ứng dụng bật stack stack cho chương trình, chương trình sử dụng stack để gọi hàm Trong trình duyệt WEB, trang xem lưu stack Trong trình soạn thảo văn bản, thao tác Undo lưu stack Ứng dụng gián tiếp: Cấu trúc liệu bổ trợ cho thuật toán khác Một thành phần cấu trúc liệu khác PhD Ngo Huu Phuc, Le Quy Don Technical University 9.1 Khái niệm stacks (6/7) Thực thi giới hạn stack Thực thi Gọi n số nhớ cho stack Khơng gian sử dụng stack O(n) Với thao tác, độ phức tạp O(1) Giới hạn Kích thước tối đa stack định nghĩa trước, thay đổi (nếu dùng mảng) Nếu stack đầy, không PUSH phần tử vào stack Nếu stack rỗng, thao tác POP cho kết rỗng PhD Ngo Huu Phuc, Le Quy Don Technical University 9.1 Khái niệm stacks (7/7) Đối với stack cần: Định nghĩa stack: MAXSIZE: Số phần tử tối đa stack (nếu dùng mảng) ItemType: Kiểu liệu cho stack Thao tác chính: Push Pop Peek Thao tác khác: IsEmpty IsFull MakeEmpty 10 PhD Ngo Huu Phuc, Le Quy Don Technical University 9.2 Thao tác stack (1/9) Trước hết, định nghĩa kích thước cho stack: Ví dụ: #define MAXSIZE 100 Có thể sử dụng stack để lưu kiểu liệu nào, cần định nghĩa kiểu liệu cho stack: Ví dụ: int stack[MAXSIZE]; Có thể dùng trỏ để xác định đỉnh stack đơn giản hơn, dùng phần tử mảng stack để lưu số phần có stack: Ví dụ: stack[0] = 0; 11 PhD Ngo Huu Phuc, Le Quy Don Technical University 9.2 Thao tác stack (2/9) Thao tác Push (newItem: ItemType) Chức năng: Thêm phần tử vào đỉnh Stack Điều kiện thực hiện: Stack khởi tạo chưa đầy Kết quả: Nếu thêm thành công, newItem đỉnh Stack 12 PhD Ngo Huu Phuc, Le Quy Don Technical University 9.2 Thao tác stack (3/9) Ví dụ hàm push: void push(int stack[], int value) { if(stack[0] < MAXSIZE-1 ) { stack[0] = stack[0] + 1; stack[stack[0]] = value; } else { printf("Khong the them vao STACK\n"); getch(); } } 13 PhD Ngo Huu Phuc, Le Quy Don Technical University 9.2 Thao tác stack (4/9) Thao tác Pop (item: ItemType) Chức năng: Lấy phần tử đỉnh Stack trả lại cho lời gọi hàm Điều kiện: Stack khởi tạo không rỗng Kết quả: Phần tử đỉnh Stack trả lại cho lời gọi hàm số phần tử Stack giảm 14 PhD Ngo Huu Phuc, Le Quy Don Technical University 9.2 Thao tác stack (5/9) Ví dụ hàm pop: int pop(int stack[]) { int value; if(stack[0] > ) { value = stack[stack[0]]; stack[0] = stack[0] - 1; } else { printf("STACK rong\n"); value = -32768; } return value; } 15 PhD Ngo Huu Phuc, Le Quy Don Technical University 9.2 Thao tác stack (7/9) Thao tác Peek: Chức năng: Lấy giá trị đỉnh Stack không loại phần tử đỉnh Stack Điều kiện: Stack khởi tạo không rỗng Kết quả: Giá trị đỉnh Stack trả cho lời gọi hàm, Stack không thay đổi 16 PhD Ngo Huu Phuc, Le Quy Don Technical University 9.2 Thao tác stack (8/9) Ví dụ hàm Peek int peek(int stack[]) { if(stack[0]>0) return stack[stack[0]]; else { printf("STACK rong\n"); return -32768; } } 17 PhD Ngo Huu Phuc, Le Quy Don Technical University 9.3 Các thao tác khác stacks (1/9) Thao tác isEmpty: Kiểm tra xem Stack có rỗng khơng? Thao tác isFull: Kiểm tra xem Stack đầy chưa? Thao tác makeEmpty: Làm rỗng Stack Xây dựng hàm Push sử dụng thao tác isFull Xây dựng hàm Pop sử dụng thao tác isEmpty Xây dựng hàm Peek sử dụng thao tác isEmpty 18 PhD Ngo Huu Phuc, Le Quy Don Technical University 9.3 Các thao tác khác stacks (2/9) Thao tác isEmpty: Kiểm tra xem Stack có rỗng khơng? Nếu rỗng hàm trả 1, không hàm trả int isEmpty(int stack[]) { if(stack[0]==0) return 1; else return 0; } 19 PhD Ngo Huu Phuc, Le Quy Don Technical University 9.3 Các thao tác khác stacks (3/9) Thao tác isFull: Kiểm tra xem Stack đầy chưa? Nếu đầy, hàm trả 1; chưa đầy, hàm trả int isFull(int stack[]) { if(stack[0]==MAXSIZE-1) return 1; else return 0; } 20 PhD Ngo Huu Phuc, Le Quy Don Technical University 9.3 Các thao tác khác stacks (4/9) Thao tác makeEmpty: Làm rỗng Stack Đưa số phần tử Stack void makeEmpty(int stack[]) { stack[0]=0; } 21 PhD Ngo Huu Phuc, Le Quy Don Technical University 9.3 Các thao tác khác stacks (5/9) Xây dựng hàm Push sử dụng thao tác isFull: void push2(int stack[], int value) { if(!isFull(stack)) { stack[0] = stack[0] + 1; stack[stack[0]] = value; } else { printf("Khong the them vao STACK\n"); getch(); } } 22 PhD Ngo Huu Phuc, Le Quy Don Technical University 9.3 Các thao tác khác stacks (6/9) Xây dựng hàm Pop sử dụng thao tác isEmpty int pop2(int stack[]) { int value; if(!isEmpty(stack)) { value = stack[stack[0]]; stack[0] = stack[0] - 1; } else { printf("STACK rong\n"); value = -32768; } return value; } 23 PhD Ngo Huu Phuc, Le Quy Don Technical University 9.3 Các thao tác khác stacks (8/9) Xây dựng hàm Peek sử dụng thao tác isEmpty int peek2(int stack[]) { if(!isEmpty(stack)) return stack[stack[0]]; else { printf("STACK rong\n"); return -32768; } } 24 PhD Ngo Huu Phuc, Le Quy Don Technical University ... stack Ứng dụng gián tiếp: Cấu trúc liệu bổ trợ cho thuật toán khác Một thành phần cấu trúc liệu khác PhD Ngo Huu Phuc, Le Quy Don Technical University 9.1 Khái niệm stacks (6/7) Thực thi giới... Algorithms, Chapter Stacks and Queues Elliz Horowitz – Fundamentals of Data Structures, Chapter Stacks and Queues Deshpande Kakle – C and Data Structures, Chapter 19 Stacks and Queues Bài giảng TS Nguyễn.. .Bài Ngăn xếp Nội dung: 9.1 Khái niệm stacks (7) 9.2 Các thao tác stacks (9) 9.3 Các thao tác khác stacks (9) Tham khảo: Data structures and Algorithms Stacks. htm Kyle Loudon