Nganxep

Embed Size (px)

DESCRIPTION

stack

Citation preview

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)