You are on page 1of 44

LOGO

NGĂN XẾP (STACK)

CHƯƠNG

3
NỘI DUNG
❖ Tổng quan về ngăn xếp
❖ Cài đặt ngăn xếp bằng mảng
❖ Cài đặt ngăn xếp bằng DSLK
❖ Bài tập
MÔ TẢ STACK
▪ Một stack là một cấu trúc
dữ liệu mà việc thêm vào
và loại bỏ được thực hiện
tại một đầu (gọi là đỉnh –
top của stack).
▪ Là một dạng vào sau ra
Chồng sách trước – LIFO (Last In First
Out)

Chồng chén
MÔ TẢ STACK
CÁC PHÉP TOÁN CỦA STACK
❑ Khởi tạo Stack
❑ Kiểm tra Stack rỗng
❑ Kiểm tra Stack đầy
❑ Thêm một phần tử vào Stack
❑ Lấy một phần tử ra khỏi Stack
VÍ DỤ CÁC PHÉP TOÁN
 Stack rỗng:

 Đẩy (push) Q vào:


Q

 Đẩy A vào: A
Q
 Lấy (pop) ra một => được A:
A
 Lấy ra một => được Q và stack Q
rỗng:

Q
NỘI DUNG
❖ Tổng quan về ngăn xếp
❖ Cài đặt ngăn xếp bằng mảng
❖ Cài đặt ngăn xếp bằng DSLK
❖ Bài tập
KHAI BÁO STACK
const MaxStack=100;
typedef struct
{
int top;
int nut[MaxStack];
} Stack;
KHỞI TẠO STACK
Thao tác này thực hiện việc gán giá trị -1 cho
biến top, cho biết ngăn xếp đang ở trạng thái
rỗng.
void Stack_Initialize(Stack &s)
{
s.top=-1;
}
KIỂM TRA STACK RỖNG
❑ Stack rỗng khi top=-1
int StackEmpty(Stack s)
{
return (s.top==-1);
}
KIỂM TRA STACK ĐẦY
❑ Stack đầy khi top=MaxStack-1
int StackFull(Stack s)
{
return (s.top==MaxStack-1);
}
THÊM MỘT PHẦN TỬ VÀO STACK
7
top 5

1 count=3
count=2

void Push(Stack &s,int x)


{
if(StackFull(s))
printf("\nNgan xep da day!");
else
s.nut[++s.top]=x;
}
LẤY MỘT PHẦN TỬ TỪ STACK
top 7

1 count=2
count=3
int Pop(Stack &s)
{
if(StackEmpty(s))
printf("Ngan xep da rong!");
else
return s.nut[s.top--];
}
NỘI DUNG
❖ Tổng quan về ngăn xếp
❖ Cài đặt ngăn xếp bằng mảng
❖ Cài đặt ngăn xếp bằng DSLK
❖ Bài tập
KHAI BÁO STACK
typedef struct Node
{ int info;
StackNode *next;
} StackNode;

typedef StackNode * Stack;

Stack top;
KHỞI TẠO STACK
❑ Thao tác này thực hiện việc gán giá trị
NULL cho biến top, cho biết ngăn xếp đang
ở trạng thái rỗng.
void Stack_Initialize(Stack top)
{
top=NULL;
}
KIỂM TRA STACK RỖNG
❑ Stack rỗng khi top=NULL
int StackEmpty(Stack top)
{
return top==NULL;
}
THÊM MỘT PHẦN TỬ VÀO STACK
void Push(Stack top,int x)
{
Stack s = new StackNode;
s->info=x;
s->next=top;
top=s;
}
LẤY MỘT PHẦN TỬ TỪ STACK
int Pop(Stack top)
{ if(StackEmpty(top))
printf("\nStack is empty!");
else
{
Stack s=top;
int x=s->info;
top=top->next;
delete s;
return x;
}
}
NỘI DUNG
❖ Tổng quan về ngăn xếp
❖ Cài đặt ngăn xếp bằng mảng
❖ Cài đặt ngăn xếp bằng DSLK
❖ Các ứng dụng của ngăn xếp
❖ Bài tập
CÁC ỨNG DỤNG CỦA STACK
1. Đổi cơ số (1)
Biểu diễn số
▪ Hệ thập phân: 271 = 2 * 102+ 7 * 101
+ 1 * 100
▪ Hệ nhị phân
110110 = 1* 25 + 1 * 24 + 0 * 23 + 1 * 22
+ 1 * 21 + 0 * 20
❖Qui tắc đổi từ thập phân sang cơ số n
▪ Chia liên tiếp số cần đổi cho n
▪ Lấy số dư (các số <n) theo chiều ngược lại
CÁC ỨNG DỤNG CỦA STACK
1. Đổi cơ số (2)
Ví dụ: đổi số 215 sang nhị phân
CÁC ỨNG DỤNG CỦA STACK
1. Đổi cơ số (3)
Nhận xét? Số dư tạo ra sau thì được hiển thị
trước -> phù hợp với cơ chế hoạt động của stack
-> dùng stack để lưu trữ các số dư sau mỗi
phép chia 1
1
❖Ví dụ: đổi 19 sang nhị1 phân

1
CÁC ỨNG DỤNG CỦA STACK
1. Đổi cơ số (4)
Giải thuật chuyển đổi số thập phân n sang cơ số base
void ChangeBase (int n, int base)
// hàm đổi cho cơ số 2<=base<=9
{ Stack s;
while(n!=0) { 1
r=n % base; //tính11số dư của phép chia
push(s, r); //push số dư vào stack
n= n / base;
}
while (! StackEmpty(s)) //in ra màn hình giá trị
cout<<pop(s); // của phần tử được pop từ stack
}1
CÁC ỨNG DỤNG CỦA STACK
2. Ký pháp Ba Lan (1)
Biểu thức dạng trung tố: dấu của các phé
toán hai ngôi luôn được đặt giữa 2 toán hạng
§ Ví dụ: A + B * C (A+B) * C
1
A+B*C –11 D (A + B )* (C – D)
Qui định thứ tự ưu tiên của các phép toán
Dùng dấu ngoặc để phân biệt thứ tự thực hiện
Độ ưu tiên của toán tử giảm từ trái sang phải;
( )→ (*) ;( /)→ (+) ; (-)
CÁC ỨNG DỤNG CỦA STACK
2. Ký pháp Ba Lan (2)
NHÓM 1
Biểu thức dạng tiền tố:
Trung tố Tiền tố
A+B +AB Không
(A+B)*C 1 *+ A B C cần
A+B*C-D - + A* B C D có dấu
(A + B )* (C – D) *+AB–CD ngoặc
CÁC ỨNG DỤNG CỦA STACK
2. Ký pháp Ba Lan (3)
Biểu thức dạng hậu tố:

Trung tố Hậu tố
A+B AB+ Không
(A+B)*C
1
AB+C* cần
có dấu
A+B*C-D ABC*+D- ngoặc
(A + B )* (C – D) A B + C D - *
CÁC ỨNG DỤNG CỦA STACK
2. Ký pháp Ba Lan (4)
Tính giá trị biểu thức dạng hậu tố
• Biểu diễn biểu thức bằng 1 stack dạng danh
sách liên kết.
• Mỗi node trong DSLK biểu diễn cho 1 biến, hằng
1
hoặc toán tử
• Duyệt biểu thức từ trái sang phải, gặp 1 toán tử
thì 2 toán hạng đứng sát ngay trước nó sẽ được
tính, tạo thành một toán hạng mới cho toán tử
gặp tiếp theo.
CÁC ỨNG DỤNG CỦA STACK
2. Ký pháp Ba Lan (5)
Tính giá trị biểu thức dạng hậu tố
❖ Giải thuật
▪ Đọc biểu thức từ trái qua phải
Trong khi chưa hết biểu thức
• Nếu kí tự là toán 1hạng thì giữ lại giá trị
• Nếu là toán tử thì 2 giá trị vừa được giữ lại
sẽ được lấy ra và tính theo toán tử vừa được
đọc; lưu lại gi trị vừa được tính
▪ Giá trị cuối cùng được lưu lại là giá trị của
biểu thức
CÁC ỨNG DỤNG CỦA STACK
2. Ký pháp Ba Lan (6)
Tính giá trị biểu thức dạng hậu tố
• Nhận xét: 2 toán hạng được đọc sau
được kết hợp với toán tử đọc trước ->
giá trị nào vào sau thì được xử lý trước
1
=> Phù hợp với cách hoạt động của
stack.
CÁC ỨNG DỤNG CỦA STACK
2. Ký pháp Ba Lan (7)
Tính giá trị biểu thức dạng hậu tố
Tính biểu thức ( A + B ) * ( C - ( D + A ) )
Với A = 1, B = 5, C = 8, D = 4
=> Biểu thức hậu tố: A B + C D A + - *
1
CÁC ỨNG DỤNG CỦA STACK
2. Ký pháp Ba Lan (8)
Tính giá trị biểu thức dạng hậu tố
Mã giả
while (chưa hết danh sách){
1. đọc 1 kí tự x trong danh sách
2. if (x là toán hạng)
1
2.1 Push(x)
3. else // x là toán tử
3.1 y = Pop()
3.2 z = Pop()
3.3 w = z T y //tính giá trị w theo toán tử T
3.4 Push (w)
}
CÁC ỨNG DỤNG CỦA STACK
2. Ký pháp Ba Lan (8)
Ví dụ :Tính giá trị biểu thức dạng hậu tố sau
CÁC ỨNG DỤNG CỦA STACK
2. Ký pháp Ba Lan (9)
Chuyển trung tố sang hậu tố
Nhận xét
▪ Nếu xuất hiện dấu ‘(‘ thì phải có ‘)’ tương ứng
▪ Dấu mở ngoặc gặp trước sẽ được đóng
1
ngoặc sau
▪ Khi gặp toán tử, phải chờ xác định toán hạn
thứ 2 thì mới đặt toán tử sau toán hạng này
Dùng stack để lưu trữ dấu ‘(‘ ‘)’ và các toán tử
CÁC ỨNG DỤNG CỦA STACK
2. Ký pháp Ba Lan (10)
Chuyển trung tố sang hậu tố
Mã giả: P là biểu thức trung tố ban đầu, Q là biểu
thức kết quả dạng hậu tố
0.1 Push(‘(‘)
0.2 Thêm ‘)’ vào cuối
1
while (chưa hết biểu thức P)
{
1. Đọc 1 kí tự x trong P (từ trái qua phải)
2. if (x là toán hạng)
Thêm x vào Q
3. if (x là dấu mở ngoặc ‘(‘ )
Push(x);
CÁC ỨNG DỤNG CỦA STACK
2. Ký pháp Ba Lan (11)
Chuyển trung tố sang hậu tố
4. if (x là toán tử)
4.1 while(
thứ tự ưu tiên (toán tử ở đỉnh của stack) >= x)
4.1.1 w = Pop()
4.1.2 Thêm w vào1 Q
4.2 Push(x)
5. if (x là dấu ngoặc đóng)
5.1 while( chưa gặp ngoặc mở
5.1.1 w = Pop()
5.1.2 Thêm w vào Q
5.2 Pop(); //đẩy ngoặc mở ra khỏi stack
} //while (chưa hết biểu thức P)
CÁC ỨNG DỤNG CỦA STACK
2. Ký pháp Ba Lan (12)
Chuyển trung tố sang hậu tố
Ví dụ 1: P = ( A + B ) * ( C - ( D + A ) )

1
CÁC ỨNG DỤNG CỦA STACK
2. Ký pháp Ba Lan (13)
Chuyển trung tố sang hậu tố
Ví dụ 2: đổi biểu thức trung tố sang biểu thức dạng
hậu tố
P = A + (B * C – (D / E ^ F) * G) *
Ví dụ 3: đổi biểu thức trung tố sang biểu thức
dạng hậu tố
CÁC ỨNG DỤNG CỦA STACK
3. Các ứng dụng khác

▪ Trong trình biên dịch, stack được sử dụng


để Lưu môi trường các thủ tục
▪ Dùng trong một số bài toán của lý thuyết
đồ thị
▪ Khử đệ qui đuôi.
NỘI DUNG
❖ Tổng quan về ngăn xếp
❖ Cài đặt ngăn xếp bằng mảng
❖ Cài đặt ngăn xếp bằng DSLK
❖ Các ứng dụng của ngăn xếp
❖ Bài tập
BÀI TẬP
1. Cho biết nội dung của stack sau mỗi thao tác
trong dãy: EAS*Y**QUE***ST***I*ON
Một chữ cái tượng trưng cho thao tác thêm chữ
cái đó vào stack, dấu * tượng trưng cho thao tác
lấy nội dung một phần tử trong stack in lên màn
hình. Cho biết kết quả xuất ra màn hình sau khi
hoàn tất chuỗi trên?
BÀI TẬP
2. Cho biết nội dung của stack và giá trị của các
biến sau khi thực hiện các thao tác sau: A= 5, B= 3,
C= 7
a. Tạo stack
b. Push A
c. Push C*C
b. Pop và lưu trữ vào B
c. Push B+A
d. Pop và lưu trữ vào A
e. Pop và lưu trữ vào B
BÀI TẬP
3. Viết chương trình đổi số nguyên không âm sang số
nhị phân
4. Viết chương trình đảo ngược một xâu ký tự
5. Viết chương trình đảo ngược một danh sách
6. Cho một stack S. Hãy viết chương trình con thực
hiện các công việc sau:
▪ Đếm số phần tử của stack S
▪ Xuất nội dung phần tử thứ n của stack S
BÀI TẬP
▪ Xuất nội dung của stack S
▪ Loại phần tử thứ n của stack S
7. Cho biểu thức dạng trung tố P
A/(B+C)+D*(E+F)
a. Hãy viết biểu thức dạng hậu tố ứng với P
b. Minh họa tình trạng của stack qua các bướ
thực hiện tính biểu thức hậu tố với A = 12, B
7, C = 3, D = 2, E = 1, F = 5

You might also like