Upload
vokien
View
224
Download
4
Embed Size (px)
Citation preview
CẤU TRÚC DỮ LIỆU& GIẢI THUẬT 1
NGĂN XẾP & HÀNG ĐỢI
Stack• Ngăn xếp là một danh sách đặc biệt mà
trong đó việc thêm vào hoặc loại bỏ mộtphần tử chỉ thực hiện tại một đầu củadanh sách, đầu này gọi là đỉnh (TOP) củadanh sách.
• Dữ liệu được thêm vào sau sẽ lấy ra trướctheo nguyên tắc LIFO (Last In First Out),hay vào trước sẽ lấy ra sau theo nguyêntắc FILO (First In Last Out).
2
3
Push
Stack
Top
Data
Stack
Top
Pop
Stack
Top
Data
Stack
Top
Tổ chức dữ liệu và định nghĩa kiểu• Cách 1: Sử dụng một mảng với thao tác: Thêm cuối. Lấy cuối.
• Cách 2: Sử dụng một danh sách liên kếtđơn với thao tác: Thêm đầu. Lấy đầu.
4
Các thao tác trên stack• Khởi tạo stack• Kiểm tra stack rỗng• Kiểm tra stack đầy• Thêm 1 phần tử vào stack (push)• Lấy một phần tử ra khỏi stack (pop)
5
Cài đặt stack bằng mảng• Định nghĩa cấu trúc Stack#define MAX 100struct Stack{
int n;int e[MAX];
};• Hàm khởi tạovoid init (Stack &s){
s.n=-1;}
6
Cài đặt stack bằng mảng• Kiểm tra ngăn xếp rỗngint isEmpty (Stack s){
if(s.n==-1)return 1;
return 0;}• Kiểm tra ngăn xếp đầyint isFull (Stack s){
return (s.n==MAX-1);}
7
Thêm 1 phần tử vào stackvoid push (Stack &s, int x){
if(isFull(s))cout<<"Ngan xep day!";
else{
s.n++;s.e[s.n]=x;
}}
8
Lấy 1 phần tử ra khỏi stackint pop (Stack &s){
if(isEmpty(s)){
cout<<"Ngan xep rong";return -1;
}else
return s.e[s.n--];}
9
Hàm inputvoid input (Stack &s){
int m,x;cout<<"Nhap so phan tu: ";cin>>m;for(int i=0;i<m;i++){
cout<<"Nhap gia tri: ";cin>>x;push(s,x);
}}
10
Hàm main• Hàm outputvoid output (Stack &s){
while(isEmpty(s)==0)cout<<pop(s)<<" ";
}• Hàm mainint main (){
Stack S;init(S);input(S);cout<<"Lay cac phan tu ra ngan xep: ";output(S);
} 11
Cài đặt stack bằng danh sách liên kết
• Định nghĩa cấu trúc Stackstruct node{
int data;node *next;
};typedef node * Pnode;
12
Cài đặt stack bằng danh sách liên kết• Khởi tạo stackvoid init (Pnode &H){
H=NULL;}• Kiểm tra stack rỗngint isEmpty (Pnode H){
return (H==NULL);}
13
Thêm 1 phần tử vào stackvoid push (Pnode &H,int x){
Pnode p;p=new node;p->data=x;p->next=H;H=p;
}
14
Lấy 1 phần tử ra khỏi stackint pop (Pnode &H){
int x;Pnode p;x=H->data;p=H;H=H->next;delete p;return x;
}15
Một số ứng dụng của stack• Đảo ngược chuỗi ký tự.• Chuyển đổi số từ hệ thập phân sang hệ
cơ số bất kỳ.• Tính giá trị biểu thức dạng hậu tố (postfix).• Chuyển một biểu thức dạng trung tố sang
hậu tố (infix to postfix).• Sử dụng stack trong các trường hợp khử
đệ quy để loại bỏ tính đệ quy trongchương trình.
16
Bài tập1. Viết chương trình cài đặt ngăn xếp các số
nguyên bằng mảng.2. Viết chương trình cài đặt ngăn xếp các số
nguyên bằng danh sách liên kết.3. Viết chương trình đổi 1 số từ hệ thập
phân sang hệ nhị phân.4. Viết chương trình đảo ngược chuỗi sử
dụng stack.
17
Queue• Hàng đợi là một cấu trúc dữ liệu gần giống với
ngăn xếp, nhưng khác ngăn xếp ở nguyên tắcchọn phần tử cần lấy ra. Phần tử được lấy rakhỏi hàng đợi không phải là phần tử mới nhấtđược thêm vào, mà là phần tử đã được đưa vàohàng đợi lâu nhất.
18
• Việc thêm một đối tượngvào hàng đợi hoặc lấy ramột đối tượng từ hàng đợiđược thực hiện theo cơchế “vào trước ra trước” -FIFO (Fisrt In First Out).
Tổ chức cài đặt queue• Cách 1: Sử dụng 1 mảng để lưu trữ các
phần tử trong hàng đợi với thao tác: Thêm cuối Lấy đầu
• Cách 2: Sử dụng danh sách liên kết đơnquản lý bằng 2 con trỏ, với thao tác: Thêm cuối Lấy đầu
19
Các thao tác trên queue• Khởi tạo queue• Kiểm tra queue rỗng• Kiểm tra queue đầy• Thêm 1 phần tử vào queue (put)• Lấy một phần tử ra khỏi queue (get)
20
Cài đặt queue bằng mảng• Cấu trúc queue gồm các thành phần: Mảng một chiều lưu trữ các phần tử. Phần tử đầu hàng đợi (front), có chỉ số là f. Phần tử cuối hàng đợi (rear), có chỉ số là r.
• Nếu mảng tính từ chỉ số 0 thì ban đầu khởi tạof=0, r=-1.
• Để thêm 1 phần tử vào queue, tăng r lên 1 vàthêm phần tử vào vị trí r.
• Để loại 1 phần tử khỏi queue, lấy giá trị ở vị trí f vàtăng chỉ số f lên 1.
• Khi r tăng lên hết khoảng chỉ số của mảng thìmảng đầy, khi đó không thể thêm vào mảng đượcnữa.
• Khi f>r thì queue rỗng.21
Cài đặt queue bằng mảng#define MAX 100struct Queue{
int f, r;int e[MAX];
};void init (Queue &q){
q.f=0;q.r=-1;
}
int IsEmpty (Queue q){
if (q.f > q.r)return 1;
return 0;}int IsFull (Queue q){
if (q.r== MAX)return 1;
return 0;}
22
Hàm putvoid put (Queue &q, int x){
q.r++; // tăng r lên 1if (IsFull(q))
cout<<“Queue full!”;else
q.e[q.r] = x;}
23
Hàm getint get (Queue &q){
int x;if (IsEmpty(q))
cout<<“Queue empty!”;elsex = q.e[q.f++];return x;
}24
Cài đặt queue bằng danh sách liên kết • Định nghĩa cấu trúc queue gồm 2 con trỏ: 1 con
trỏ chỉ đầu danh sách và 1 con trỏ chỉ đến cuốidanh sách.
struct node{
int data;node *next;
};typedef node * Pnode;struct Queue{
Pnode H, T;};
25
• Khởi tạo queuevoid init (Queue &q){
q.H=q.T=NULL;}• Kiểm tra queue rỗngint isEmpty (Queue q){
if(q.H==NULL)return 1;
return 0;}
Cài đặt queue bằng danh sách liên kết Thêm 1 phần tử vào Queuevoid put (Queue &q, int x){
if (isEmpty(q)){
q.H=new node;q.H->data=x;q.H->next=q.T;q.T=q.H;return;
}q.T->next=new node;q.T=q.T->next;q.T->data=x;q.T->next=NULL;
}
Lấy 1 phần tử ra khỏi Queueint get (Queue &q){
Pnode p;int x;p=q.H;q.H=p->next;if (isEmpty(q)){
q.T=NULL;}x=p->data;delete p;return x;
} 26
Hàm inputvoid input (Queue &q){
int m,x;cout<<"Nhap so phan tu: ";cin>>m;for(int i=0;i<m;i++){
cout<<"Nhap gia tri: ";cin>>x;put(q,x);
}}
27
Hàm output, main• Hàm outputvoid output (Queue &q){
while(isEmpty(q)==0)cout<<get(q)<<" ";
cout<<"\n";}• Hàm mainint main (){
Queue q;init(q);input(q);cout<<"Lay cac phan tu ra hang doi: ";output(q);
} 28
Các ứng dụng queue• Các vấn đề liên quan đến cơ chế “vào trước
ra trước” đều có thể dùng cấu trúc dữ liệuqueue.
• Ví dụ cơ chế sản xuất và tiêu thụ: hàng hóasản xuất trước được đưa vào kho và sẽđược xuất ra trước.
• Ứng dụng đặt vé tàu lửa, máy bay, hệ thốngrút tiền…
• Ứng dụng trong hệ điều hành: bộ đếm ứngdụng, hàng đợi xử lý các sự kiện, xử lý phímnhấn, tiến trình…
29
Bài tập1. Viết chương trình cài đặt hàng đợi các số
nguyên bằng mảng.2. Viết chương trình cài đặt hàng đợi các số
nguyên bằng danh sách liên kết.
30