栈的概念
栈(STACK)是限制只能在表的一端进行插入和删除的线性表。我们把栈中能进行插入和删除的一端 为栈顶(top),而另一因定端称为栈底bottom)。把一个元素放入栈中的操作叫做进本或压栈(push),从栈中取出一个元素的操作称为出本或称弹出(pop)。直观地讲,栈的进栈操作就象往冲锋枪弹匣中压入子弹(装弹),栈的出栈操作就象从弹匣弹出子弹(发射子弹)。也就蠊栈中能直接存取的位置是栈的顶部。由于这个限制,栈操作就符合下面的规律:最后放入栈中的元素首先取出,帮栈又称为后进先出(LIFO:Last In First Out)线性表。栈的操作如图所示。 我们要注的是:当执行(d)眇时,栈顶指示器top 倒退了一步,尽管原单元中仍留有'd'的内容,但对栈这个结构来说,是已不能再存取它。也就是说'd'已不再存在于栈中。
例题:表达式的计算——中缀表达式改为后缀表达式
{
By Unite Space 2001
http://www.cpascal.com
e-mail:webmaster@cpascal.com
}
const
smaxsize=100;
type
selement=char;
sposition=0..smaxsize;
stack=record
data:array[1..smaxsize]of selement;
top:sposition;
end;
var
s:stack;
strin,strout:string;
procedure screat(var s:stack);
begin
s.top:=0;
end;
function sempty(var s:stack):boolean;
begin
if s.top=0 then sempty:=true
else sempty:=false;
end;
function sfull(var s:stack):boolean;
begin
if s.top=smaxsize then sfull:=true
else sfull:=false;
end;
procedure spush(e:selement;var s:stack);
begin
inc(s.top);
s.data[s.top]:=e;
end;
procedure spop(var e:selement;var s:stack);
begin
e:=s.data[s.top];
dec(s.top);
end;
procedure stop(var e:selement;var s:stack);
begin
e:=s.data[s.top];
end;
function first(t:selement):integer;
begin
case t of
'(':first:=0;
'+','-':first:=1;
'*','/':first:=2;
end;
end;
procedure change(strin:string;var strout:string;var s:stack);
var
t:selement;
md,me,mt:set of selement;
i,j:integer;
begin
md:=['0'..'9',' ',';'];me:=['+','-','*','/','(',')'];
mt:=md+me;
strin:=strin+';';
spush('(',s);
for i:=1 to length(strin) do
case strin[i] of
'0'..'9':strout:=strout+strin[i];
'(':spush(strin[i],s);
')',';':repeat
spop(t,s);
if t<>'(' then
strout:=strout+t;
until (t='(')or(sempty(s));
'+','-','*','/':begin
stop(t,s);
while first(strin[i])<=first(t) do
begin
spop(t,s);
strout:=strout+t;
stop(t,s);
end;
spush(strin[i],s);
end;
end;
end;
begin
strout:='';
writeln;
writeln;
write('enter a formual:');
readln(strin);
while pos(' ',strin)<>0 do delete(strin,pos(' ',strin),1);
screat(s);
change(strin,strout,s);
writeln('output formual is :',strout);
readln;
end.
{
By Unite Space 2001
http://www.cpascal.com
e-mail:webmaster@cpascal.com
}
队列的概念
队列(Queue)是限定仅能在表的一端进行插入,在表的另一端进行删除的线性表。在队列中可以插入的一端称为队尾,可以删除的一端称为队首。把一个元素插入队列中的操作叫做进队,从队列中删除一个元素的操作帮出队。在日常生 ,售标窗外或服务台前,顾客按到达的先后次序排成一队。排在队首的先到者首先取得服务,然后离队,而所有的顾客一律平等,严格遵守秩序,不存在插队现象。也就是说队列中,先来的对象首先离队取得服务,因此队列符合这个规律:和入队列中的元素首先取出,帮队列又称为先进先出生率FIFO:First In First Out)线性表。队列的操作如图示:
在队的操作中,图2.8中每一个元素出队后(如a元素),后面跟着的元素(如b,c,d)要依次往前移一位,就象旅客排队购标一样,第一个离开,后面的跟上,在计算机实现进,对于有N个元素的队列,前面的元同队,其后的N-1元素要依次前移,即要进行N-1次数组元素的交换。这样务必增加计算机完成一次队操俾的所需的时间。为了减小队操作的时间,我们可交换。这样务必增加计算机完成一次队操作的所需的时间。为了减小队操作的时间,我们可以改为由服务员移动售票的方法,可旅客移动,也即通过修改队首位轩的方法来完成。