C u trúc d li u và gi i thu t ADT Stack
Bài tp ln
CU TRÚC D LIU VÀ GII THUT
Đề tài: ADT Stacks [Ngăn xếp]
-o0o-
Mai Xuân C ng - Nguy n Trung Dũng A - Hoàng M nh Hùngườ
Nguy n Th Thu Nga - Vũ Th Quỳnh Trang - Ngô Anh Tu n - Nguy n Tu n
***
I. Định nghĩa:
*ADT (Abstract Data Types) – kiu d liu tru tượng bao gm:
- Tp các giá tr (đối tượng)
- Tp các phép toán có th thc hin vi tt c các giá tr này
- Cách biu din d liu được s dng chung cho tt c các giá tr này
*Stack (ngăn xếp): là mt kiu d liu tru tượng, mt dng đặc bit ca danh sách tuyến tính
(dãy gm 0 hoc nhiu hơn các phn t cùng kiu cho trước) trong đó các đi tượng được np
vào (push) và ly ra (pop) ch t mt đầu gi là đỉnh (top) ca danh sách.
nguyên tc: vào sau ra trước (LIFO – last in first out)
- Đối tượng ct gi: các phn t - s (nguyên, thc), ký t, xâu
(string), mng (array), bn ghi (record), file...
- Các phép toán cơ bn:
+ push đẩy phn t vào ngăn xếp
+ pop ly phn t ra khi ngăn xếp
+ isEmpty kim tra ngăn xếp rng
+ size tr v s phn t ca ngăn xếp
+ top tr v giá tr ca phn t nm đầu danh sách mà không ly nó ra khi ngăn xếp
II. Cài đặt:
1- Các cu trúc d liu để biu din và cài đặt các phép toán:
a) Mng:
+ np các phn t theo th t t trái sang phi
+ có biến lưu tr ch s ca phn t đầu ngăn xếp
Stack 3 5 2 …… 6 7
0 1 2 …. n maxn
+ trong đó:
maxn _ s phn t ti đa xin cp phát ca ngăn xếp
n _ biến dùng để lưu tr ch s phn t đầu ngăn xếp
+ mt hn chế ca vic s dng mng là phi khai báo kích thước ti đa để d phòng nên gây
lãng phí b nh hoc phi thông báo tràn b nh (Full Stack) khi thc hin thao tác push
b) Danh sách móc ni (con tr):
1
C u trúc d li u và gi i thu t ADT Stack
+ mi nút bao gm 2 thành phn cơ bn: elements để lưu tr ni dung d liu ca phn t,
*next là con tr đến nút tiếp theo trong ngăn xếp
+ thao tác b sung và loi b luôn làm vic nút đầu tiên thông qua vic s dng mt con tr
*top tr đến nút đầu tiên trong ngăn xếp
+ vic s dng danh sách móc ni (hay con tr) có mt ưu đim là không phi khai báo s phn
t ti đa ca ngăn xếp để d phòng t đó có th tiết kim được b nh không cn thiết.
7 54 ……. 93 5 NULL
*top elements *next
2- Chương trình minh ha: file: StackPtr.cpp, STACKARR.cpp
III. ng dng:
1- Phát biu bài toán:
*Tính giá tr biu thc s hc:
Biu thc s hc xut hin rt nhiu trong cuc sng và vic tính toán giá tr ca các biu thc
đó là điu tt yếu, quan trng. Ví d:
- Khi s dng máy tính (calculator), người dùng s nhp các biu thc s hc cn tính thông
qua các phím s và phép toán có sn. Nhim v ca máy s tính toán và hin th kết qu chính
xác ra màn hình.
- Khi s dng các bng tính đin t (như Excel, …) để lp các bng tính lương, thng kê vic thu
chi ca doanh nghip…, người dùng s nhp các biu thc s hc vào các ô tính. Khi đó, chương
trình s có nhim v phân tích và tính toán ri đưa ra kết qu ti ô đó.
- Hay trong các ngôn ng lp trình (như C, PASCAL…), ta đã khá quen thuc vi các lnh gán
X=<biu thc s hc> //X là biến
Khi thc hin chương trình, gp các lnh gán, máy tính cn phi xác định giá tr ca các biu
thc s hc đó và gán kết qu cho biến X.
Vì vy, vic xây dng mt chương trình tính toán giá tr ca các biu thc s hc là cn thiết.
Biu thc s hc là mt dãy các toán hng (hng (s), biến hoc hàm) ni vi nhau bi các
phép toán s hc (như cng, tr, nhân, chia, lũy tha, căn thc,...). Trong các biu thc có th
cha các du ngoc tròn để xác định th t ưu tiên. Khi đó các phép toán trong ngoc s được
thc hin trước các phép toán ngoài.
Các phép toán s hc được phân ra làm 2 loi:
- Các phép toán hai ngôi (+, -, *, /, ^,…): mi phép toán được đặt gia các toán hng. Ví d:
2+3, 56*12, 3^8,…
- Các phép toán mt ngôi (căn, logarit, các hàm lượng giác: sin, cos, tg,…): mi phép toán đi
ngay trước toán hng. Ví d: sin4, ln7,…
Hơn na, khi tính các biu thc s hc, ta cn phi tuân theo nhng quy tc sau:
- Th t ưu tiên: ^ *, / +, -
- Quy tc kết hp: cho biết khi có 2 phép toán có cùng th t ưu tiên thì s thc hin phép toán
nào trước.
+ ^: thc hin t phi qua trái.
+ + - * /: thc hin t trái qua phi.
2
C u trúc d li u và gi i thu t ADT Stack
+ du () được ưu tiên hơn c th t ưu tiên và quy tc kết hp.
2- Mô t thut toán gii và đánh giá độ phc tp ca thut toán:
a) Mô t thut toán gii:
Bài toán tính toán giá tr ca biu thc s hc được xây dng mt cách d dàng bng thut toán
Ba Lan trên cơ s ng dng ca kiu d liu tru tượng ngăn xếp (stack).
*Ký pháp nghch đảo Ba Lan:
Ký pháp nghch đảo Ba Lan được phát minh vào khong gia thp k 1950 bi Charles Hamblin
- mt triết hc gia và khoa hc gia máy tính người Úc - da theo công trình v ký pháp Ba Lan
ca nhà Toán hc người Ba Lan Jan Łukasiewicz. Hamblin trình bày nghiên cu ca mình ti mt
hi ngh khoa hc vào tháng 6 năm 1957 và chính thc công b vào năm 1962.
T cái tên hu t cũng có th đoán ra phn nào là theo cách biu din này, các toán t s được
đặt sau các toán hng. C th là biu thc trung t: 4+5 s được biu din li thành 4 5 +.
Ý tưởng là đọc biu thc t trái sang phi, nếu gp mt toán hng (con s hoc biến) thì push
toán hng này vào ngăn xếp; nếu gp toán t, ly hai toán hng ra khi ngăn xếp (stack), tính kết
qu, đẩy kết qu tr li ngăn xếp. Khi quá trình kết thúc thì con s cui cùng còn li trong ngăn
xếp chính là giá tr ca biu thc đó.
Ví d: biu thc trung t :
5 + ((1 + 2) * 4) + 3
được biu din li dưới dng hu t là (ta s bàn v thut toán chuyn đổi t trung t sang hu
t sau): 5 1 2 + 4 * + 3 +
Quá trình tính toán s din ra theo như bng dưới đây:
Ký tThao tác Trng thái stack
5 Push 5 5
1 Push 1 5, 1
2 Push 2 5, 1, 2
+ Tính 1 + 2
Push 3
5, 3
4 Push 4 5, 3, 4
* Tính 3 * 4
Push 12
5, 12
+ Tính 12 + 5
Push 17
17
3 Push 3 17, 3
+ Tính 17 + 3
Push 20
20
Chuyn đổi t trung t sang hu t:
3
C u trúc d li u và gi i thu t ADT Stack
Thut toán chuyn đổi này được phát minh bi v giáo sư người Đức ni tiếng Edsger Dijkstra
(cũng là tác gi ca thut toán tìm đường đi ngn nht được đặt theo tên ông và semaphore, mt
k thut để đồng b các tiến trình trong lp trình đa nhim). Thut toán này cũng da theo cơ chế
ngăn xếp. Ý tưởng chung ca thut toán cũng là duyt biu thc t trái sang phi:
- Nếu gp mt toán hng (con s hoc biến) thì ghi nó vào chui kết qu (chui kết qu là biu
thc trung t).
- Nếu gp du m ngoc, đưa nó vào stack.
- Nếu gp mt toán t (gi là o1 ), thc hin hai bước sau:
+ Chng nào còn có mt toán t o2 đỉnh ngăn xếp VÀ độ ưu tiên ca o1 nh hơn hay bng độ
ưu tiên ca o2 thì ly o2 ra khi ngăn xếp và ghi vào kết qu.
+ Push o1 vào ngăn xếp
- Nếu gp du đóng ngoc thì c ly các toán t trong ngăn xếp ra và ghi vào kết qu cho đến
khi ly được du m ngoc ra khi ngăn xếp.
- Khi đã duyt hết biu thc trung t, ln lượt ly tt c toán hng (nếu có) t ngăn xếp ra và ghi
vào chui kết qu.
Để d hiu, bn hãy quan sát quá trình thc thi ca thut toán qua mt ví d c th sau:
Biu thc cn chuyn đổi: 3+4*2/(1-5)
Ký tThao tác Stack Chui hu t
3 Ghi 3 vào k.qu 3
+ Push + +
4 Ghi 4 vào k.qu 3 4
* Push * + *
2 Ghi 2 vào kqu 3 4 2
/ Ly * ra khi stack, ghi vào
k.qu, push / + / 3 4 2 *
( Push ( + / ( 3 4 2 *
1 Ghi 1 vào k.qu+ / ( 3 4 2 * 1
- Push - + / ( - 3 4 2 * 1
5 Ghi 5 vào k.qu + / ( - 3 4 2 * 1 5
) Pop cho đến khi ly được (, ghi
các toán t pop được ra k.qu + / 3 4 2 * 1 5 -
2 Ghi 2 ra k.qu + / 3 4 2 * 1 5 – 2
Pop tt c các toán t ra khi
ngăn xếp và ghi vào kết qu 3 4 2 * 1 5 – 2 / +
b) Đánh giá đ phc tp ca thut toán:
Gi s xâu biu thc dng trung t đu vào có độ dài là n
Gi thi gian tính ca thut toán là O(f(n)),
- thi gian tính ca hàm convert (char *input, char *output) chuyn đổi xâu biu thc đu vào
t dng trung t sang hu t là O(g(n)),
- thi gian tính ca hàm tinhtoan (char *bieuthuc) tính toán giá tr ca biu thc dng hu t là
O(h(n)).
4
C u trúc d li u và gi i thu t ADT Stack
Ta có: thi gian cài đặt và thc hin các phép toán cơ bn trên stack như Push(), Pop(),
Is_Empty(), … là hng s O(1).
Vy ta có thi gian tính ca thut toán là:
O(f(n)) = max {O(g(n)), O(h(n))}
* Đánh giá đ phc tp ca hàm convert(char *input, char *output) tính O(g(n))
- Chuyn xâu biu thc đầu vào sang ch thường strlwr(input) thi gian tính là O(n);
- Duyt toàn b xâu:
while(input[i]!=’\0’)
{while(input[i]==””) // loi b du “ ”;
{// câu lnh hoc khi câu lnh vi thi gian O(1);
i++;
}
if(((input[i]>='0')&&(input[i]<='9'))||(input[i]=='.'))
{while(((input[i]>='0')&&(input[i]<='9'))||(input[i]=='.'))
{// câu lnh hoc khi câu lnh vi thi gian O(1);
}
}
elseif(…)
{
}
}
+ Vòng lp này thc hin cho đến khi gp phn t NULL ca biu thc (kết thúc biu thc), nếu
là ký t rng (du cách) thì b qua (tăng ch s phn t ca xâu thêm mt đơn v) ri tiếp tc cho
đến khi hết các ký t cách lin nhau, gp ch s hoc du chm thì đưa vào output cho đến khi
hết các ký t này lin nhau… Vì vy, thut toán ch duyt qua xâu biu thc đúng mt ln thi
gian tính là O(n)
thi gian tính ca hàm convert(char *input, char *output) là:
O(g(n)) = max{O(n),O(n)} = O(n)
* Đánh giá đ phc tp ca hàm tinhtoan(char *bieuthuc) tính O(h(n))
Trình t thc hin ca hàm này cũng tương t như hàm convert. Tuy nhiên độ dài ca xâu đầu
vào có s thay đổi do hàm convert đã b qua các du cách và đơn gin hóa các toán t (như sin
s, cos c, ...)
Gi s độ dài ca xâu biu thc đầu vào là m (m<n)
- thi gian tính toán các phép tính cơ bn là hng s
5