大榕树——让我们共成长!
大榕树 myDrs.org
您的位置:大榕树 \ 编程       |  Logo语言   |  Pascal语言   |  信息学奥赛   |  高考保送    |  HTML版本
|  Pascal语言>>算法与技巧>>数据结构-线性表 (三)         本站全文搜索: 友情提示:

数据结构-线性表 (三)
http://www.mydrs.org  5/27/2001  大榕树


栈的概念
栈(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次数组元素的交换。这样务必增加计算机完成一次队操俾的所需的时间。为了减小队操作的时间,我们可交换。这样务必增加计算机完成一次队操作的所需的时间。为了减小队操作的时间,我们可以改为由服务员移动售票的方法,可旅客移动,也即通过修改队首位轩的方法来完成。

作 者:联合空间网络工作室
共有5142位读者阅读过此文

  • 上篇文章数据结构-线性表 (二)
  • 下篇文章Pascal基本教程 第二章

  • 发送邮件
    保存页面 打印文章 HTML版本 发表评论

    □- 近期热门文章 □- 相关文章
    1. NOIP2006竞赛大纲 [8306]
    2. 七类高中生具有保送资格 [5910]
    3. NOI2006获奖选手名单 [4955]
    4. 关于举办NOIP2006模拟赛的通告 [4106]
    5. Turbo Pascal各语句运行速... [3594]
    6. Turbo王者归来新Delphi免费... [3181]
    7. IOI2006我国4名选手全部获得金... [2945]
    8. 关于APIO2007与IOI2007... [2763]
    9. noip倒计时 by 枯叶蝴蝶 [2683]
    10. 朱泽园:思想上的金牌更重要 [2168]
    谈谈数据结构
    趣谈数据结构(七)
    趣谈数据结构(六)
    趣谈数据结构(五)
    趣谈数据结构(四)
    趣谈数据结构(三)
    趣谈数据结构(二)
    趣谈数据结构(一)
    实数类型
    数据结构-线性表 (三)
     

    关于本站 | 合作伙伴 | 联系方式
    大榕树 版权所有 ©1999-2006 www.myDrs.org 闽ICP备05000721号