Professional Documents
Culture Documents
Bài 3. Ngăn xếp và Hàng Đợi
Bài 3. Ngăn xếp và Hàng Đợi
Slide 8
3.1.3 Biểu diễn Ngăn xếp
Slide 9
3.1.3 Các thao tác cơ bản với ngăn xếp
Push: Thêm một phần tử vào đỉnh của ngăn xếp, số
phần tử của ngăn xếp tăng lên 1.
Pop: Xóa bỏ phần tử đầu tiên ở đỉnh của ngăn xếp, số
phần tử của ngăn xếp giảm đi 1.
Top: Lấy giá trị của phần tử đầu tiên ở đỉnh của ngăn
xếp, số phần tử của ngăn xếp không thay đổi.
IsEmpty: Kiểm tra ngăn xếp trống hay không. Ngăn xếp
trống là ngăn xếp không có phần tử nào.
IsFull: Kiểm tra ngăn xếp đã đầy hay chưa. Thao tác này
không phải lúc nào cũng có.
Size: Lấy số lượng phần tử stack đang có.
Slide 10
3.1.3 CÀI ĐẶT NGĂN XẾP BẰNG MẢNG
Chúng ta sẽ sử dụng mảng 1 chiều kiểu int làm Stack stack,
một biến capacity để lưu kích thước(sức chứa) của stack và
một biến top để lưu chỉ số của phần tử ở top của
Stack stack.
1. Kiểm tra stack đầy(IsFull)
Hàm này sẽ kiểm tra xem stack hiện tại đã đầy hay
chưa. Nếu chỉ số top của stack đang bằng với capacity
- 1, tức stack đã đầy 1
2
bool IsFull(int capacity){
.
if(top >= capacity - 1){
3 return true;
4 }else{
5 return false;
6 }
7 }
Slide 11
2.2. Kiểm tra stack rỗng(IsEmpty)
Nếu như stack đang không có phần tử nào, ta sẽ gán chỉ số top = -1 để đánh dấu. Như vậy, để
kiểm tra stack có đang rỗng hay không rất đơn giản. Ta chỉ cần so sánh giá trị top có phải -1 hay
không mà thôi.
1 bool IsEmpty(){
2 if(top == -1){
3 return true;
4 }else{
5 return false;
6 }
7 }
• 2.3. Thêm phần tử vào đỉnh stack(Push)
• Chúng ta sẽ chỉ có thể push(thêm phần tử) vào đỉnh stack khi stack chưa đầy. Nếu
stack đầy, chúng ta sẽ đưa ra thông báo và không thực hiện push. Ngược lại, ta sẽ
tăng top lên một đơn vị và gán giá trị cho phần tử tại chỉ số top .
1 void Push(int stack[], int value, int capacity){
2 if(IsFull(capacity) == true){
3 printf("\nStack is full. Overflow condition!");
4 }else{
5 ++top;
6 stack[top] = value;
7 }
8 }
• 2.4. Xóa phần tử khỏi đỉnh stack(Pop)
Chúng ta sẽ chỉ có thể pop(xóa phần tử) khỏi đỉnh stack khi
stack không trống. Nếu stack trống, chúng ta sẽ đưa ra thông báo và
không thực hiện pop. Ngược lại, ta sẽ giảm giá trị top đi một đơn vị.
1 void Pop(){
2 if(IsEmpty() == true){
3 printf("\nStack is empty. Underflow
4 condition!");
5 }else{
6 --top;
7 }
}
• 2.5. Lấy giá trị phần tử ở đỉnh stack(Top)
• Để lấy giá trị phần tử ở đỉnh stack, ta có thao tác rất đơn giản:
1 int Top(int stack[]){
2 return stack[top];
3 }
1 int Size(){
2 return top + 1;
3 }
• Và cuối cùng, chúng ta sẽ có 1 chương trình cài đặt stack hoàn thiện như sau:
Stack cài đặt trên con trỏ
Stack trên con trỏ vẫn là stack bình thường nhưng linh
hoạt hơn vì nó dùng con trỏ để cấp phát và quản lý,
không bị thừa hoặc thiếu gì cả.
Xây dựng cấu trúc
typedef int item; //kieu du lieu
struct Node
{
item Data; //du lieu
Node *Next; //link
};
typedef struct Stack
{
Node *Top;
};
Slide 18
Stack cài đặt trên con trỏ
Khởi tạo danh sách rỗng, kiểm tra danh sách rỗng,
độ dài danh sách
Slide 19
Stack cài đặt trên con trỏ
Tạo 1 Node
Slide 20
Stack cài đặt trên con trỏ
Chèn phần tử vào Stack (Push)
Để chèn phần tử vào Stack thì chỉ cần cho con trỏ Note
đó trỏ và Top, rồi Top trỏ lại nó là xong
Slide 21
Stack cài đặt trên con trỏ
Lấy dữ liệu tại Top nhưng không xóa (Peak)
Slide 22
Stack cài đặt trên con trỏ
Xóa và lấy dữ liệu tại Top (Pop)
Ta chỉ cần cho con trỏ Top trỏ đến vị trí thứ 2 thôi.
Slide 23
3.1.4 Ứng dụng của ngăn xếp
Slide 24
3.1.4 ỨNG DỤNG NGĂN XẾP
3.1.4 Ứng dụng của ngăn xếp
VÍ DỤ
VÍ DỤ
Đổi cơ số từ hệ thập phân sang hệ nhị phân
Slide 29
Đổi cơ số từ hệ thập phân sang hệ nhị phân
Slide 30
Bài tập ngăn xếp
Bài 3: Viết chương trình cài đặt ngăn xếp các số nguyên bằng
mảng
Slide 31
3.2. HÀNG ĐỢI
• Queue là một dạng danh sách đặt biệt, trong đó chúng ta chỉ được
phép thêm vào các phần tử ở cuối hàng đợi và xoá đi các phần tử ở
đầu hàng đợi. Vì phần tử thêm vào trước đượ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( First In First Out).
• Hàng đợi là cấu trúc được sử dụng rộng rãi trong thực tế: người ta
dùng hàng đợi để giải quyết các vấn đề có cấu trúc FIFO như xử lý
các dịch vụ của ngân hàng, để xử lý các tiến trình đang đợi phục vụ
trong các hệ điều hành nhiều người sử dụng, quản lý các yêu cầu in
trên máy print servers…
3.1. HÀNG ĐỢI
• Queue là một dạng danh sách đặt biệt, trong đó chúng ta chỉ được
phép thêm vào các phần tử ở cuối hàng đợi và xoá đi các phần tử ở
đầu hàng đợi. Vì phần tử thêm vào trước đượ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( First In First Out).
• Hàng đợi là cấu trúc được sử dụng rộng rãi trong thực tế: người ta
dùng hàng đợi để giải quyết các vấn đề có cấu trúc FIFO như xử lý
các dịch vụ của ngân hàng, để xử lý các tiến trình đang đợi phục vụ
trong các hệ điều hành nhiều người sử dụng, quản lý các yêu cầu in
trên máy print servers…
3.2. HÀNG ĐỢI
Bài 1: Viết chương trình chuyển một số nguyên thập phân sang nhị phân
Bài 2: Viết chương trình in ra màn hình các số là số nguyên tố trong Stack.
Bài 3: Viết chương trình cài đặt ngăn xếp các số nguyên bằng mảng
Bài 4: Viết chương trình nhập 1 chuỗi bất kỳ và in ra ngược đảo chuỗi đó
Bài 5: Giả sử chúng ta có một kho hàng có tính chất: mặt hàng nào nhập kho
trước sẽ xuất kho trước, mặt hàng nào nhập kho sau sẽ xuất kho sau. Chương
trình có các chức năng nhập kho, xuất kho, xem tồn kho…