You are on page 1of 33

Chương 3

NGĂN XẾP VÀ HÀNG ĐỢI

 Ngăn xếp (Stack)


 Hàng đợi (Queue)
 Các ứng dụng
3.1. NGĂN XẾP (Stack)
• Ngăn xếp là một danh sách mà các thao
tác thêm vào hoặc loại bỏ chỉ được thực
hiện ở cùng một đầu của danh sách.
• Đầu này gọi là đỉnh của ngăn xếp.
• Nguyên lý cơ bản của ngăn xếp là Last
In First Out (LIFO), có nghĩa vào sau
ra trước.
3.1. NGĂN XẾP (Stack)
• Khai báo ngăn xếp là một danh
sách đặc.

• Khai báo ngăn xếp là một danh


sách liên kết.
3.1. NGĂN XẾP (Stack)
A-Khai báo ngăn xếp là một danh
sách đặc.
Ví dụ:
#define MAX 100
typedef int STACK[MAX];
STACK S;
int nS;
3.1. NGĂN XẾP (Stack)
Các thao tác chính trên ngăn xếp:
• SetEmpty
Khởi tạo ngăn xếp rỗng.
• IsEmpty
Kiểm tra ngăn xếp rỗng.
• Push
Thêm một phần tử vào đỉnh của ngăn xếp.
• Pop
Lấy từ đỉnh của ngăn xếp một phần tử.
3.1. NGĂN XẾP (Stack)
• SetEmpty
Khởi tạo ngăn xếp rỗng.

void SetEmpty(STACK S, int &nS)


{
nS=0;
}
3.1. NGĂN XẾP (Stack)
• IsEmpty
Kiểm tra ngăn xếp rỗng.

int IsEmpty(STACK S, int nS)


{
return nS==0;
}
3.1. NGĂN XẾP (Stack)
• Push
Đưa một phần tử vào đỉnh của ngăn xếp.

void Push(int x, STACK S, int &nS)


{
S[nS++]=x;
}
3.1. NGĂN XẾP (Stack)
• Pop
Lấy một phần tử ra khỏi đỉnh của ngăn
xếp.

int Pop(STACK S, int &nS)


{
return S[--nS];
}
3.1. NGĂN XẾP (Stack)
B-Khai báo ngăn xếp là một danh
sách liên kết.
Ví dụ:
typedef struct pt{
int data;
struct pt *next;
} phantu;
typedef phantu* STACK;
STACK S;
3.1. NGĂN XẾP (Stack)
Các thao tác chính trên ngăn xếp:
• SetEmpty
Khởi tạo ngăn xếp rỗng.
• IsEmpty
Kiểm tra ngăn xếp rỗng.
• Push
Thêm một phần tử vào đỉnh của ngăn xếp.
• Pop
Lấy từ đỉnh của ngăn xếp một phần tử.
3.1. NGĂN XẾP (Stack)
• SetEmpty
Khởi tạo ngăn xếp rỗng.

void SetEmpty(STACK &S)


{
S=NULL;
}
3.1. NGĂN XẾP (Stack)
• IsEmpty
Kiểm tra ngăn xếp rỗng.

int IsEmpty(STACK S)
{
return S==NULL;
}
3.1. NGĂN XẾP (Stack)
• Push
Đưa một phần tử vào đỉnh của ngăn xếp.
void Push(int x, STACK &S)
{
STACK p;
p=(STACK) malloc(sizeof(phantu));
p->data=x;
p->next=S;
S=p;
}
3.1. NGĂN XẾP (Stack)
• Pop
Lấy một phần tử ra khỏi đỉnh của ngăn xếp.
int Pop(STACK &S)
{
int x;

x=S->data;
S=S->next;
return x;
}
3.2. HÀNG ĐỢI (Queue)
• Hàng đợi là danh sách mà thao tác thêm
vào được thực hiện ở đầu này, còn thao
tác loại bỏ được thực hiện ở đầu kia của
danh sách.
• Nguyên lý cơ bản của hàng đợi là First
In First Out (FIFO), có nghĩa vào trước
ra trước.
3.2. HÀNG ĐỢI (Queue)
• Khai báo hàng đợi là một danh
sách đặc.

• Khai báo hàng đợi là một danh


sách liên kết.
3.2. HÀNG ĐỢI (Queue)
A-Khai báo hàng đợi là một danh
sách đặc.
Ví dụ:
#define MAX 100
typedef int QUEUE[MAX];
QUEUE Q;
int fQ, rQ;
3.2. HÀNG ĐỢI (Queue)
Các thao tác chính trên hàng đợi :
• SetEmpty
Khởi tạo hàng đợi rỗng.
• IsEmpty
Kiểm tra hàng đợi rỗng.
• EnQueue
Thêm một phần tử vào đuôi (rear) hàng đợi.
• DeQueue
Lấy từ đầu (front) hàng đợi một phần tử.
3.2. HÀNG ĐỢI (Queue)
• SetEmpty
Khởi tạo hàng đợi rỗng.

void SetEmpty(QUEUE Q, int &fQ, int &rQ)


{
fQ=0;
rQ=-1;
}
3.2. HÀNG ĐỢI (Queue)
• IsEmpty
Kiểm tra hàng đợi rỗng.

int IsEmpty(QUEUE Q, int fQ, int rQ)


{
return fQ>rQ;
}
3.2. HÀNG ĐỢI (Queue)
• EnQueue
Đưa một phần tử vào đuôi hàng đợi.

void EnQueue(int x, QUEUE Q, int &rQ)


{
Q[++rQ]=x;
}
3.2. HÀNG ĐỢI (Queue)
• DeQueue
Lấy một phần tử ra khỏi đầu hàng đợi.

int DeQueue(QUEUE Q, int &fQ)


{
return Q[fQ++];
}
3.2. HÀNG ĐỢI (Queue)
B-Khai báo hàng đợi là một danh
sách liên kết.
Ví dụ:
typedef struct pt{
int data;
struct pt *next;
} phantu;
typedef phantu* QUEUE;
QUEUE fQ, rQ;
3.2. HÀNG ĐỢI (Queue)
Các thao tác chính trên hàng đợi :
• SetEmpty
Khởi tạo hàng đợi rỗng.
• IsEmpty
Kiểm tra hàng đợi rỗng.
• EnQueue
Thêm một phần tử vào đuôi hàng đợi.
• DeQueue
Lấy từ đầu hàng đợi một phần tử.
3.2. HÀNG ĐỢI (Queue)
• SetEmpty
Khởi tạo hàng đợi rỗng.

void SetEmpty(QUEUE &fQ, QUEUE &rQ)


{
fQ=rQ=NULL;
}
Tuy nhiên có thể không cần tham số thứ
hai là con trỏ rQ, vì khi tạo phần tử đầu
tiên là cho fQ=rQ.
3.2. HÀNG ĐỢI (Queue)
• IsEmpty
Kiểm tra hàng đợi rỗng.

int IsEmpty(QUEUE fQ)


{
return fQ==NULL;
}
Chỉ cần kiểm tra fQ, không cần rQ.
3.2. HÀNG ĐỢI (Queue)
• EnQueue
Đưa một phần tử vào đuôi hàng đợi.
void EnQueue(int x, QUEUE &rQ)
{
QUEUE p;
p=(QUEUE) malloc(sizeof(phantu));
p->data=x; p->next=NULL;
if (IsEmpty(fQ)) fQ=rQ=p;
else{ rQ->next=p; rQ=p; }
}
3.2. HÀNG ĐỢI (Queue)
• DeQueue
Lấy một phần tử ra khỏi đầu hàng đợi.

int DeQueue(QUEUE &fQ)


{
int x;
x=fQ->data;
fQ=fQ->next;
return x;
}
3.3. CÁC ỨNG DỤNG
 Đảo chuỗi ký tự
3.3. CÁC ỨNG DỤNG
 Đổi cơ số
3.3. CÁC ỨNG DỤNG
 Kiểm tra chuỗi Palindrome
“ABLE was I ere I saw ELBA”
“lewd I did evil, live did I dwel”
3.3. CÁC ỨNG DỤNG
 Cộng hai số lớn có nhiều chữ số

You might also like