Chương IV. NGĂN XP (STACK) VÀ HÀNG
ĐỢI (QUEUE)
I. ĐỊNH NGHĨA STACK
Stack là 1 kiu danh sách đặc bit mà phép b sung và phép loi b luôn thc
hin 1 đầu; đưc gi là đỉnh (top)
Có th hình dung cơ cu ca stack như 1 chng đĩa. Đưa thêm 1 đĩa mio
thì đặt nó vào đầu phía trên (đỉnh), ly 1 đĩa ra thì cũng ly đựơc t đầu đó. Đĩa
đưao sau cùng, chính là đĩa đang nm đỉnh, và nó cũng chính là đĩa s đưc
ly ra trước tiên. Còn đĩa đưa vào đầu tiên li đang v trí được gi là đáy
(bottom) và chính là đĩa đưc ly ra sau cùng.
Như vy stack hot động theo cơ chế : “vào-sau-ra-trước” (last-in-first-out).
Do đó stack đưc gi là danh sách kiu LIFO. Stack th rng nghĩa là không có
phn to.
II. LƯU TR K TIP ĐỐI VI STACK
Đó chính cách cài đặt stack bi 1 vectơ lưu tr Stack, S bao gm n ô nh kế
tiếp nhau. Như vy phn t đỉnh stack s đưc định v bi 1 ch s i nào đó , mà
ta coi như 1 địa ch tương đối (địa ch thc-địa ch tuyt đối-s đựơc xác định như
đã nêu mc 2.2.2 thuc chương 2).
Có th coi i nhng giá tr ca 1 con tr T, tr ti đỉnh stack. Người ta quy ước
T=0 nghĩa là stack rng.Như vy, T=i thì stack có i phn t. Rõ ràng 0Tn, khi
T=n thì stack s đầy, lúc đó nếu có pp b sung 1 phn t mi vào stack thì s
không thc hin đưc, vì “không còn ch; ta nói là có hin tượng TRÀN
(Overflow) và tt nhiên vic x phi ngng li.Còn nếu T=0 nghĩa là stack đã
rng, li phép loi b 1 phn t ra khi stack thì phép x này cũng không
thc hin đưc. Ta nói : có hin tượng CN (Underflow).Sau đây là hình nh cài
đặt ca stack vi 3 phn t :
S[1]
S[2]
S[3]
S
Đáy
ca
stack
T
Hình 4.1
Khi b sung 1 phn t mi vào thì T tăng lên 1, còn li khi loi b 1 phn t
ra khi stack thì T gim đi 1.
Hai th tc dưới đây th hin 2 phép xnày.
Void PUSH(S,T,X);
/*Thc hin vic b sung phn t Xo Stack, cài đặt bi Vectơ S mà T
đang tr ti đỉnh*/
{
/*Kim tra xem Stack đã đầy chưa*/
If (T=n)
{
printf (“Stack s TRÀN/n”);
return;
}
/*Chuyn con tr*/
T=T+1;
/*Np X vào*/
S[T]=X;
}
Void POP(S,T,X);
/*Thc hin vic loi phn t đang đỉnh Stack ra khi Stack và bo lưu
thông tin ca phn t nàyo Y*/
{
/*Kim tra xem Stack có cn không*/
If (T=0)
{
printf (“Stack đã CN/n”);
return;
}
/*Bo lưu thông tin ca phn t s b loi*/
Y=S[T];
/*Chuyn con tr*/
T=T-1;
}
III. ÁP DNG CA STACK
1. Bài toán đổi cơ s t thp phân sang nh phân
Ta đã biết : d liu lưu tr trong b nh ca MTĐT đều đưc biu din dưới
dng s nh phân (vi 2 ch só 0 và 1). Như vy là s thp phân xut hin trong
chương trình đều phi chuyn đổi sang nh phân . Trước khi x lí vàc kết qu
dưới dng s nh phân s được đổi sang thp pn để hin th cho người dùng biết
(vì người dùng vn đã quen vi s thp phân ri).
Mt cách tng quát : s thp pn bao gm 2 phn, phn nguyên và phn
phnó thp pn – mà ta quen gi là phn l. Vic chuyn đổi sang s nh phân,
ng vi 2 phn, có khác nhau. đây ta ch xét ti vic chuyn phn nguyên thôi,
hay nói cách khác : ta st ti vic chuyn đổi 1 s nguyên dưới dng thp phân
sang nh phân.
Trước hết ta cn thy rng :
dng s thp phân 274 biu din cho con s giá tr là:
2 . 102 + 3 . 101 + 4 . 100
Nếu đem con s này chia cho 10 và để ý ti các s dư ta s thy:
Mã s 274 chính là dng hin th ca các s dư, theo th t xut hin và
ngược li.
Tương t như vy, mã s nh phân ca 1 con s, cho dưới dng thp phân,
cũng s được xác định vi phép chia và ly s dư, ch có khác là bây gi thc hin
phép chia vi 2 dư s s là s 0 hoc 1 thôi.
Như vy ràng là trong cách chuyn đổi này các s dư đã được to ra sau
li hin th trước. Cơ chế sp xếp này rt phù hp vi cơ chế hot động ca stack.
Vì vy trong gii thut chuyn đổi s nguyên t thp phân sang nh phân, người ta
thường s dng 1 stack để lưu tr s dư, sau đó li ly các s này li t stack để
hin th thành mã s nh phân.
Gi s stack được cài đặt bi 1 vectơ lưu tr S, mà T là con tr, tr ti đỉnh;
c đầu stack rng, nghĩa là T=0.
Có th viết gii thut chuyn đổi 1 s nguyên N sang dng nh phân bng
th tc như sau :
Void CHANGE(N);
{
m=N
/*Tính s dưnp vào Stack(S)*/
While m!=0
{
R=m mod 2; /*Tính s dư*/
PUSH(S,T,R); /*Np R vào Stack S*/
M=m div 2; /*Thay m bng thương ca phép chia m cho 2*/
}
/*Hin th tng ch s nh phân trong mã s biu din N*/
While T!=0
{
Call POP(S,T,X); /*Ly s ra khi Stack */
Printf(X);
}
}
Ví d:
N=39
Ta có mã s nh phân biu din chp s 39 : 100111
Khi thc hin CHANGE(N) thì:
2. Biu thc s hc vi pháp BA _ LAN
Ta xét 1 biu thc s hc vi các phép toán 2 ngôi như các phép : cng(+),
tr(-), nhân(), chia(/), lu tha() v.v…
39
2
19
2
9
2
4
2
2
2
1
2
0
S dư
được np
vào Stack
S
1
1
1
1
1
1
1
1
1
0
1
1
1
0
0
1
1
1
0
0
1
Ly s t
Stack ra để
hin th
1
1
1
1
1
1
1
1
1
0
1
1
1
0
0
1
0
0
1
1
1
Hình 4.2
Ta thy, vi phép toán này thì toán t (du phép toán) bao gi cũng đặt
gia 2 toán hng ( vy ta nói : biu thc s hc thông thường đưc viết theo
pháp trung t (ifix notation). Vi kí pháp này thì nhiu khi để phân bit 2 toán
hng ng vi 1 toán t ta bt buc phi dùng c cp du ngoc đơn hoc nếu
không thì phi chp nhn 1 th t ưu tiên giac phép toán như đã đưc qui
định trong các ngôn ng lp tnh. C th là th t ưu tiên được xếp theo trình t
sau :
1. Phép lu tha
2. Phép nhân, phép chia
3. Phép cng, pp tr
c phép toán cùng th t ưu tiên thì s đưc thc hin theo trình t : trái
trước, phi sau (trong biu thc).
Ví d : A + B C – D
s được thc hin theo trình t :
B C
ri A +(B C)
cui cùng là : (A +(B C)) – D
tương t như vy
A B – C / D + E
s được thc hin :
B
ri : A (B)
C / D
A (B) – (C / D)
cui cùng là :
(A (B) (C / D)) + E
(Chú ý là : du ngoc trong cách viết trên ta thêm vào để phân bit toán hng
ng vi 1 toán t).
ràngch viết biu thc theo kí pháp trung t vi vic s dng du ngoc
th t ưu tiên gia các phép toán đã khiến cho vic tính toán giá tr biu thc
khácng knh.
Trong nhng năm đầu 1950, nhà tn hc Ba Lan : Jan Lukasiewcz đã đưa
ra dng kí pháp mi để biu din các biu thc mà không cn ti du ngoc, đó là
kí pháp tin t (preix notation)hu t (postfix notation) mà gi chung là
pháp Ba – Lan (Polish notation)
a. Biu thc dng tin t và hu t