CHUYN : NGN XP, HNG I
TRNG THPT CHUYN TNH LO CAI
T TON - TIN-----------------*@*---------------------
CHUYN NGN XP (STACK)
NM HC: 2014 - 2015
A, M U 1. L do chn ti
Ngn xp v hng i l hai kiu d liu tru tng rt quan trng v c s dng nhiu trong thit k thut ton. V bn cht, ngn xp v hng i l danh sch tc l mt tp hp cc phn t cng kiu c tnh th t. Ngn xp c s dng rt nhiu trong vic gii quyt cc bi ton v th trong cc thi hc sinh gii. Tuy nhin trong qu trnh ging dy ti thy hc sinh vn cn kh khn trong vic phn tch bi ton c th p dng c thut ton v ci t gii bi ton. V vy ti chn chuyn ny gip hc sinh c ci nhn tng quan hn v ngn xp v ng dng ca ngn xp trong gii cc bi ton c th.2. Mc ch ca tiV ni dung kin thc ngn xp c rt nhiu ti liu cp n, trong chuyn ny ti ch tng hp li cc ni dung kin thc c v ch yu l a vo p dng gii mt s bi ton c th, lm ti liu tham kho cho hc sinh v gio vin trong qu trnh hc tp v ging dy cc i tuyn hc sinh giiB. NI DUNG1, Khi nim: Stack l mt kiu danh sch tuyn tnh c bit m php b sung v loi b lun thc hin mt u gi l nh (Top). C th hnh dung n nh c cu ca mt hp cha n sng trng hoc sng tiu lin. Khi lp n hay ly n ra cng ch u hp. Vin n va lp vo s trn nh hp v vin n lp vo u tin s y hp (Bottom). Vin n np vo sau cng li l vin n bn u tin.
Vi nguyn tc hot ng ca stack vo sau ra trc nn n cn c gi vi tn danh sch kiu LIFO (Last - In - First - Out).
2, Ci t stack
Ta ci t ngn xp nh mt mng cha cc phn t ca ngn xp v mt bin top lu tr v tr ca phn t nh trong ngn xp.
Const
MaxSize = 100; { di cc i ca stack }
Type
ElementType = integer; { kiu cc phn t ca stack }
StackType = array[1..MaxSize] of ElementType;
Var
top : integer;
stack : StackType;
3, Cc php x l trn stack
a. Khi to stack rng: top := 0;b. Kim tra mt stack c rng hay khng:
if top = 0 then < stack rng >
else < stack khng rng >;c. Th tc ly mt phn t nh stack
Function Pop : ElementType; { Tr li phn t trn nh stack }
Begin
if top = 0 then writeln('STACK can!')
else begin
Pop := stack[top];
top := top - 1;
end;
End;
d. Th tc y mt phn t vo stack:Procedure Push(x : ElementType); { y phn t x vo ngn xp }
Begin
if top = MaxSize then writeln('STACK tran!')
else begin
top := top + 1;
stack[top] := x;
end;
End;
4, ng dng ca ngn xp: k php nghch o Ba Lan (RPN- Reverse Polish Notation)
Nhim v ca b dch (compiler) l to ra cc ch th my cn thit thc hin cc lnh ca chng trnh gc vit trong mt ngn ng lp trnh cp cao. Mt phn ca nhim v ny l to ra cc ch th my nh gi biu thc s hc. Chng hn nh trong lnh gn x := a( b + c; b dch phi to ra cc ch th my tng t nh sau:
Loa a; np gi tr ca nh a vo thanh ghi d tr
Mul b; nhn gi tr ca nh b vi gi tr trong thanh ghi d tr
Add c; cng thm gi tr ca thanh ghi d tr vi gi tr trong nh c
Sto x; lu tr gi tr trong thanh ghi d tr vo nh x
Trong a s cc ngn ng lp trnh, cc biu thc s hc c vit nh dng thng thng ca ton hc, ngha l theo k php trung t (Infix notation): mi ton t 2 ngi c t gia 2 ton hng v c th thm du ngoc. Nhiu b dch trc ht chuyn cc biu thc trung t ny sang k php hu t (Postfix notation) hay tin t (Prefix notation). dng hu t cc ton t i sau ton hng v dng tin t th cc ton t i trc ton hng. V d:
Infix2((3+4)
Postfix2 3 4 + (
Prefix( 2 + 3 4
Nhng nm u 1950, nh lgc hc Ba Lan: Jan Lukasiewicz pht hin rng cc du ngoc l khng cn thit trong k php hu t cng nh tin t. Sau y ta ch xt i vi k php hu t, cn gi l k php nghch o Ba Lan RPN - Reverse Polish Notation (ta c th suy ra hon ton tng t vi k php tin t).
5, Chuyn biu thc t dng trung t sang dng hu t
minh ho ta xt biu thc trung t sau y: 7 + 2 * 3. Khi c biu thc ny t tri sang phi, gi tr 7 c hin th ngay lp tc. Tip theo l ton t +, nhng n c lu tr v ton hng bn phi ca n cha c hin th, v vy n c y vo ngn xp cc ton t:
u raNgn xp
7+
Tip theo l ton hng 2 c c v c hin th. Lc ny n phi c xc nh l ton hng bn phi ca ton t + hay l ton hng bn tri ca ton t tip theo. xc nh iu ny ta so snh ton t + nh ngn xp vi ton t tip theo *. Bi v * c u tin hn +, ton hng 2 l ton hng bn tri ca ton t *. V vy ta y * vo ngn xp v tm ton hng bn phi ca n:
u raNgn xp
*
7 2+
Ton hng 3 c c v hin th. Bi v lc ny ta t n kt thc biu thc, ton hng bn phi ca ton t * nh ngn xp c tm ra, ton t * c th ly ra t ngn xp v hin th:
u raNgn xp
7 2 3 *+
Du kt thc biu thc cng ch ra rng ton hng bn phi ca ton t cn li + trong ngn xp c tm ra, v vy n c ly ra v hin th, ta c biu thc RPN: 7 2 3 * +
Cc du ngoc trong biu thc trung t khng gy kh khn thc s no c. Du ngoc bn tri ch ra bt u mt biu thc con v khi c n c y vo ngn xp. n khi gp du ngoc phi, cc ton t c ly ra t ngn xp cho n khi du ngoc tri tng ng xut hin nh. Lc ny, biu thc con ban u trong cc du ngoc c chuyn sang dng RPN, v vy c th b qua chng, v vy php chuyn i tip tc.
Thut ton chuyn t dng trung t sang dng RPN:
1. Khi ng mt ngn xp rng cc ton t.
2. While doa. c phn t x (hng s, bin s, ton t s hc, cc du ngoc tri v ngoc phi) tip theo trong biu thc trung t.
b. Nu phn t x l:
Du ngoc tri: y n vo ngn xp.
Du ngoc phi: ly ra v hin th cc phn t ca ngn xp cho n khi du ngoc tri c c. Nu ngn xp rng th xy ra li.
Ton t: nu ngn xp rng hay x c u tin hn phn t nh ngn xp, y x vo ngn xp.
Nu khc, ly ra v hin th phn t nh ngn xp; Lp li vic so snh x vi phn t nh ngn xp. (Du ngoc tri c xem u tin thp hn cc ton t).
Ton hng: hin th n.
3. Khi t n kt thc ca biu thc trung t, ly ra v hin th cc phn t ca ngn xp cho n khi ngn xp rng.
Ci t: chng trnh ny gi s cc ton hng, ton t ch gm 1 k t v gi s biu thc trung t l hp l v ch kim tra rt t tnh ng n ca biu thc trung t.
Program Infix_to_rpn;
Uses crt;
Const
MaxSize = 100;
EndMask = ';'; { dau ket thuc bieu thuc trung to }
Var
infix, rpn : string;
top : integer;
stack : array[1..MaxSize] of char;
Function Pop : char;
Begin
Pop := stack[top];
top := top - 1;
End;
Procedure Push(x : char);
Begin
top := top + 1;
stack[top] := x;
End;
Function Priority(operator : char) : integer;
{ ham tra lai do uu tien cua cac toan tu }
Begin
case operator of
'(' : Priority:=0;
'+', '-' : Priority := 1;
'*', '/' : Priority := 2;
end;
End;
Procedure Convert_to_rpn;
Var
i : integer;
x, symbol : char;
error, donePop : boolean;
Begin
write('Bieu thuc dang RPN la: ');
rpn := '';
top := 0;
error := false;
i := 1;
x := infix[1];
while (x EndMask) and not error do
begin
while infix[i] = ' ' do i := i + 1; { nhay qua cac dau cach }
x := infix[i];
if x = EndMask then break;
case x of
'(' : Push(x);
')' : begin
donePop := false;
repeat
if top = 0 then error := true
else begin
symbol := Pop;
if symbol = '(' then donePop := true
else rpn := rpn + symbol;
end;
until donePop or Error;
end;
'+', '-', '*', '/':
begin
donePop := false;
while (top 0) and (not donePop) do
begin
symbol := Pop;
if Priority(x)
Recommended