栈的基本知识

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

栈的基本知识

[内容提要]

1、栈的概念和特性;

2、栈的存储结构:顺序存储和链式存储;

3、双栈及操作;

4、栈的几种运算(操作)实现;

5、栈的简单应用举例;

[重点难点]

1、栈的特性和应用场合;

2、栈的存储结构;

3、栈的操作实现;

[内容讲授]

1.栈的概念和特性

栈(stack)是一种特殊的线性表。作为一个简单的例子,可以把食堂里冼净的一摞碗看作一个栈。在通常情况下,最先冼净的碗总是放在最底下,后冼净的碗总是摞在最顶上。而在使用时,却是从顶上拿取,也就是说,后冼的先取用,后摞上的先取用。如果我们把冼净的碗“摞上”称为进栈(压栈),把“取用碗”称为出栈(弹出),那么上例的特点是:后进栈的先出栈。然而,摞起来的碗实际上是一个线性表,只不过“进栈”和“出栈”都在最顶上进行,或者说,元素的插入和删除操作都是在线性表的一端进行而已。

一般而言,栈是一个线性表,其所有的插入和删除操作均是限定在线性表的一端进行,允许插入和删除的一端称栈顶(Top),不允许插入和删除的一端称栈底(Bottom)。若给定一个栈S=(a

1

,

a 2,a

3

,……,a

n

),则称a

1

为栈底元素,a

n

为栈顶元素,元素a

i

位于元素a

i-1

之上。栈中元素按

a 1, a

2

,a

3

,……,a

n

的次序进栈,如果从这个栈中取出所有的元素,则出栈次序为a

n

, a

n-1

,……,

a

1

。也就是说,栈中元素的进出是按后进先出的原则进行,这是栈结构的重要特征。因此栈又称为后进先出(LIFO—Last In First Out)表。

我们常用一个图来形象地表示栈,其形式如下图:

⑴在使用栈之前,首先需要建立一个空栈,称建栈(栈的初始化);

⑵往栈顶加入一个新元素,称进栈(压栈、入栈);

⑶删除栈顶元素,称出栈(退栈、弹出);

⑷查看当前的栈顶元素,称读栈;{注意与⑶的区别}

⑸在使用栈的过程中,还要不断测试栈是否为空或已满,称为测试栈。

2.栈的存储结构

(1)顺序栈

栈是一种线性表,在计算机中用一维数组作为栈的存储结构最为简单,操作也最为方便。例如,设一维数组STACK[1..n] 表示一个栈,其中n为栈的容量,即可存放元素的最大个数。栈的第一个元素,或称栈底元素,是存放在STACK[1]处,第二个元素存放在STACK[2]处,第i个元素存放在STACK[i]处。另外,由于栈顶元素经常变动,需要设置一个指针变量top,用来指示栈顶当前位置,栈中没有元素即栈空时,令top=0;当top=n时,表示栈满。

如果一个栈已经为空,但用户还继续做出栈(读栈)操作,则会出现栈的“下溢”;如果一个栈已经满了,用户还继续做进栈操作,则会出现栈的“上溢”。这两种情况统称为栈的溢出。

建栈的操作很简单,只要建立一个一维数组,再把栈顶指针置为零即可。栈的容量根据具体的应用要求而定,一般要定义的足够大。比如:

type arraytype= array[1.. n] of integer;

var stack:arraytype;

top:integer;

(2)链式栈

当我们学可指针和链表后,也可以用链表来模拟栈(链式栈),这样可以提高空间利用率,但编程复杂度提高了。定义方法如下:

type link=^node

node=record

data: integer;

next:link

end;

var hs:link;

(3)记录型栈

由于栈本身和栈顶指针是密不可分的,所以有时我们把他们定义成一个记录来处理。如:type stack=record

vec:array[1..n] of integer; {n为栈可达到的最大深度}

top:integer;

end;

3.对栈的几种运算的实现方法

(1)建栈

只要把栈顶指针置为零。即在程序开始时,置top:=0;

(2)测试栈

测试栈顶指针的值,若top=0,则栈空;若top=n,则栈满。

(3)读栈

若top=0,则栈空,无栈顶元素可读,显示出错信息,中止程序;

若top<>0,则回送栈顶元素的值STACK[top]给某个变量。

(4)进栈(push)

将栈顶指针加1后,再把新元素送到栈顶。注意进栈操作前必须保证栈不能满,否则会溢出。假设新元素x为整型,栈的最大深度为n。

则,x和n设置为值型参,而栈和栈顶指针要设置成变量型参。为什么?

procedure push(var stack:arraytype;var top:integer;n:integer;x:integer);

begin

if top=n

then begin wr iteln(‘Stack full!’); halt end

else begin top:=top+1; stack[top]:= x end

end;

(5)出栈(pop)

取得栈顶元素的值给x后,再把栈顶指针top的值减1。注意出栈操作前必须保证栈非空。还要注意都用变量型参。为什么?请问:本来的栈顶元素还在不在,还好不好调用?

procedure pop(var stack:arraytype;var top:integer;var x:integer);

begin

if top=0

then begin writeln(‘Stack empty!’); halt end

else begin x:=stack[top]; top:=top-1 end

end;

* 下面是把以上五个操作修改成链式栈的操作:

(1)置空栈setnull(hs); {不回收结点}

procedure setnull(hs:link);

begin

hs=nil ;

相关文档
最新文档