2007.08.26学习栈

栈是常用的重要数据结构,其应用也十分广泛。例如,编译器对表达式的语法分析就用到了栈。另外,函数的参数传递、函数的调用和返回也是用栈来实现的。
栈是一种只在表的一端访问元素的表,其元素只能从栈顶端增加或删除。餐厅中的食物盘或堆在一起的盘子都是栈的很好的例子。
栈被设计用来存放那些本身就只能从一端访问的元素。
栈结构就给出了其增加和删除元素的操作。压入(push)操作在栈顶增加一个元素。从栈顶删除一个元素的操作称为弹出(Pop)。图5.2给出了一系列的压入和弹出操作。最后压入栈中的元素是第一个被弹出的。因此,出入栈的顺序为后进先出(LIFO,last-in/first-out)。
理论上讲,栈可以是一个无穷大的表,就如从逻辑上说,食物盘可以堆得和天一样高。实际上,食物盘堆放在架子上,烤肉叉上也叉不上多少蔬菜。当架子或肉叉上满了时,你就无法再往栈中增加(压入)元素了。此时栈以达到它所能处理的元素个数的最大值。这种情况称为“栈满”。另一种极端情况是不可能从空架上取出食物盘来。这种情况称为“栈空”,意味着无法从栈中删除(弹出)元素。
栈的定义
栈作为一种限定性线性表,是将线性表的插入和删除运算限制为仅在表的一端进行,通常将表中允许进行插入、删除操作的一端称为(Top),因此栈顶端的当前位置是动态变化的,它由一个称为栈顶指针的位置指示器指示。同时表的另一端被称为栈底(Bottom)。当栈中没有元素是称为空栈。栈的插入操作被形象的称为进栈或入栈,删除操作称为出栈或退栈。
根据上述定义,每次进栈的元素都被放在原栈顶元素之上而成为新的栈顶,而每次出栈的总是当前栈中“最新”的元素,即最后进栈的元素。在图3.1(a)所示的栈中,元素是以a 1,a 2 ,a 3,…,a n的顺序进栈的,而退栈的次序却是a n,…,a 3,a 2,a 1.栈的修改是按后进先出的原则进行的。因此,栈又称为后进先出的线性表,简称为LIFO表。与日常生活中也可以教案到很多“后进先出”的例子,如:手枪子弹夹中子弹,子弹的装入与子弹弹出膛均在弹夹的最上端进行,先装入的子弹后发出,而后装入的子弹先发出。犹如铁路调度站“见图3.1(b)),也是栈结构的实际应用。
栈的基本操作除了在进栈(栈顶插入)、出栈(删除栈顶)外,还有建立堆栈(栈的初始化)、判空、判满即取栈顶元素等运算。下边给出栈的抽象数据类型定义:
ADT Stack
数据元素:可以是任意类型的数据,但必须属于同一个数据对象。
关系:栈中数据元素之间是线性关系。
基本操作
(1)InitStack(S)
操作前提:S为未初始化的栈。
操作结果:将D初始化为空栈。
(2)ClearStack(S)
操作前提:栈S已经存在。
操作结果: 将栈S置为空栈。
(3)IsEmpty(S)
操作前提: 栈S已经存在。
操作结果:判栈空函数,若S为空栈,则函数值为TRUE,否则FALSE。
(4)IsFull(S)
操作前提: 栈S已经存在。
操作结果:判栈满函数,若S栈已满,则函数值为TRUE,否则为FALSE。
(5)Push(S,x)
操作前提: 栈S已经存在。
操作结果:在S的顶部插入(亦称压入)元素x;若S栈未满,将x插入栈顶位置,若栈已满,则返回FALSE,表示操作失败,否则返回TRUE。
(6)Pop(S,x)
操作前提: 栈S已经存在。
操作结果:删除(亦称弹出)栈S的顶部元素,并用x带回该值;若栈为空,返回值为FALSE,表示操作失败,否则返回TRUE。
(7)GetTop(S,x)
操作前提: 栈S已经存在。
操作结果:取栈S的顶部元素。与Pop(S,x)不同之处在于GetTop(S,x)不改变栈顶的位置。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值