Tải bản đầy đủ (.pdf) (10 trang)

Ngôn ngữ lập trình C - Chương 7 - Bài 2. Stack docx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (580.08 KB, 10 trang )

4/28/2010
1
Chương 7.
Bài 2. Stack
ĐỖ BÁ LÂM
ViỆN CNTT&TT, TRƯỜNG ĐHBK HÀ NỘI
Nội dung
1. Khái niệm stack
2. Xây dựng stack
2.1. Sử dụng mảng
2.2. Sử dụng danh sách liên kết
2
1. Khái niệm stack
 Stack (ngăn xếp)
 Là một cấu trúc dữ liệu mà các
thao tác xử lý chỉ được thực hiện
ở phía đáy (cuối) của nó
 Cấu trúc dạng LIFO (Last In First
Out) – “Vào sau ra trước”
 Thao tác xử lý
• Đẩy vào PUSH
• Lấy ra POP
3
4/28/2010
2
Đáy
Đỉnh
1. Khái niệm stack
A
A
B


A
B
A
B
A
Pus h(A)
Stack có 1 phần tử:
A
Pop() Pop()
Stack rỗng
Pus h(B)
Stack có 2 phần tử:
A B
Stack còn 1 phần tử:
A
Stack lại rỗng
1. Khái niệm stack
Ứng dụng của Stack
 Lưu trữ các trang web đã từng được duyệt
trên Web browser
 Cài đặt thao tác Undo trong các phần mềm
soạn thảo
 Lưu danh sách các lời gọi hàm trong Java
Virtual Machine
4/28/2010
3
Ghi nhớ
Stack được hình dung như một ngăn xếp
chứa các quyển sách với 2 thao tác đưa
vào và lấy ra theo nguyên tắc:

 Quyển sách nào được đưa vào sau sẽ lấy ra
trước – LIFO (Last In First Out)
Ví dụ - Bài toán chuyển cơ số
 Nguyên tắc đổi một số nguyên từ thập
phân sang nhị phân:
Các số dư lấy ra sau được
hiển thị trước
Cơ chế sắp xếp của Stack
Giải pháp
Dùng stack để lưu trữ số dư qua từng
phép chia:
 Khi thực hiện phép chia: Đưa số dư vào
Stack
 Khi hiển thị kết quả: Lấy chúng lần lượt từ
Stack
4/28/2010
4
Giải pháp
0
PUSH
PUSH
0
0
0
0
1
0
0
1
1

0
0
1
1
1
0
0
1
1
0
0
0
0
0
POP
Giải thuật
1. Nhap N
2. while N != 0
R = N% 2; //Tính số dư trong phép chia N cho 2
PUSH (S, R); //Đẩy R vào đỉnh Stack S
N=N/2; //Thay N bằng N/2
3. while S chưa rỗng
POP(S,R); //Lấy phần tử từ stack đưa vào R
Hien_thi R;
2. Xây dựng Stack
 Lưu trữ được các đối tượng dữ liệu (quyển
sách)
 Xây dựng 2 thao tác Push và Pop theo
nguyên tắc LIFO
 Có hai cách cài đặt stack

 Sử dụng mảng
 Sử dụng danh sách liên kết
4/28/2010
5
2.1. Sử dụng mảng
 Mỗi phần tử của stack được lưu như một phần tử của
mảng
 Đáy: phần tử có chỉ số 0
 Đỉnh: phần tử được đưa vào cuối cùng, có chỉ số T
 Khởi tạo T=-1
 Stack rỗng (empty) T = -1, stack đầy T = MAX-1
13
Đáy Stack
2.1. Sử dụng mảng
#define MAX 100 //So phan tu lon nhat
cua Stack
//Khai bao Stack va T la 2 bien toan cuc
ElemType Stack[MAX];
int T=-1;
14
2.1. Sử dụng mảng
 Stack được biểu diễn thông qua mảng S[MAX]
 int push(ElemType N){
if (T==MAX-1) return 0;
else{ //mảng chưa đầy
T++;
S[T]=N;
}
return 1;
}

4/28/2010
6
2.1. Sử dụng mảng
 int pop(ElemType *N){
if (T== -1)
return 0;
else{
*N = S[T ];
return 1;
}
}
2.2. Sử dụng danh sách liên kết
Stack là cấu trúc LIFO (Last In First Out)
Thao tác Push, Pop?
17
Head
2.2. Sử dụng danh sách liên kết
Push
 Thêm một nút vào đầu danh sách
Pop
 Lấy giá trị nút đầu tiên trong danh sách
 Loại bỏ nút này khỏi danh sách
18
4/28/2010
7
2.2. Sử dụng danh sách liên kết
struct node {
ElemType data;
struct node *next;
};

//Khai báo con trỏ đầu là
biến toàn cục
struct node *top;
void push(ElemType N) {
struct node *temp;
temp=(struct node *)
malloc(sizeof(struct node));
temp->data = N;
temp->next = top;
top = temp;
}
7
1
8
\
top
45
Temp
Push
void push(ElemType N) {
struct node *temp;
temp=(struct node *)
malloc(sizeof(struct node));
temp->data = N;
temp->next = top;
top = temp;
}
7
1
8

\
top
45
Temp
Push
4/28/2010
8
void push(ElemType N) {
struct node *temp;
temp=(struct node *)
malloc(sizeof(struct node));
temp->data = N;
temp->next = top;
top = temp;
}
7
1
8
\
top
45
Temp
Push
7
1
8
\
45
top
Temp

int pop(ElemType *N){
struct node *temp;
if(top==NULL)
return 0;
else{
*N = top->data;
temp = top;
top = top->next;
free(temp);
return 1;
}
}
Giá trị của thành phần top cần
lưu lại trước khi giải phóng vùng nhớ
Pop
7
1
8
\
45
top
Temp
int pop(ElemType *N){
struct node *temp;
if(top==NULL)
return 0;
else{
*N = top->data;
temp = top;
top = top->next;

free(temp);
return 1;
}
}
Pop
4/28/2010
9
7
1
8
\
top
Temp
int pop(ElemType *N){
struct node *temp;
if(top==NULL)
return 0;
else{
*N = top->data;
temp = top;
top = top->next;
free(temp);
return 1;
}
}
Pop
Bài toán
Demo dS_Array.c, dS_List.c
Bài tập 1.
 Viết chương trình chuyển một số nguyên

dương từ hệ cơ số 10 sang hệ cơ số 2 sử
dụng stack (bằng mảng và danh sách liên kết)
Bài toán
Bài tập 2. Cộng hai số nguyên lớn
 Kiểu dữ liệu số nguyên chỉ biểu diễn số trong
phạm vi nhất định
 Mục đích: thực hiện thao tác cộng, trừ, nhân,
chia trên các số nằm ngoài phạm vi biểu diễn
27
4/28/2010
10
Bài toán
 Thực hiện phép cộng trên hai số nguyên
“lớn”
 Hai số được lưu dưới dạng xâu kí tự
28
Bài toán
Cải tiến
 Trong cách xây dựng stack bằng mảng, thay
vì tách rời mảng và biến T chúng ta định
nghĩa một cấu trúc gồm 2 trường là mảng và
biến T này
 Áp dụng làm lại các bài tập ở trên.
29
Thảo luận
30

×