第三章栈和队列A(NEW)资料.ppt

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1. 定义 3.1 栈 3.1.1 栈的基本概念 栈:限制仅在表尾进行插入和删除操作的线性表 栈的操作特性:按先进后出(F I L O )或后进先出(LIFO)的原则 栈顶(top):允许插入和删除的一端。 约定top始终指向栈顶位置。 栈底(bottom): 不允许插入和删除的一端。 入栈顺序: e0 e1 e2 … en-2 en-1 出栈顺序: en-1 en-2 … e2 e1 e0 例1 一个栈的输入序列为1,2,3,若在入栈的过程中允许出栈,则可能得到的出栈序列是什么? 例2:一个栈的输入序列是12345,若在入栈的过程中允许出栈,则栈的输出序列43512可能实现吗?12345的输出呢? 例3: 设依次进入一个栈的元素序列为c,a,b,d,则可得到出栈的元素序列是: A)a,b,c,d B)c,d,a,b C)b,c,d,a D)a,c,d,b Q1:堆栈是什么?它与一般线性表有什么不同? 栈的基本运算 : InitStack(s) 初始化操作,初始化为空栈s 。 IsEmpty(s) 判断栈空函数。如果s是空栈,返回“true”,否则返回“false”。 IsFull(s) 判断栈满函数。主要应用在顺序存储结构中,如果s栈满,返回“true”,否则返回“false”。 Push(s,x) 压栈操作。将元素x插入到栈s中,并使x成为新的栈顶元素。 Pop(s) 出栈函数。如果栈s非空,那么返回栈顶元素,并删除该栈顶元素,否则返回空值NULL。 GetTop(s) 获取栈顶元素。如果栈s非空,那么返回值为栈顶元素,否则返回空值NULL。 栈有两种存储结构:顺序存储结构和链式存储结构。 3.1.2 栈的顺序存储结构 顺序栈:顺序存储结构的栈。 顺序栈:用一组连续的存储单元存放自栈底到栈顶的数据元素,一般用一维数组表示 栈顶指针:指示栈顶位置 顺序栈类型: #define StackSize 100 /*顺序栈的初始分配空间*/ typedef struct sqst { DataType data[StackSize]; /*保存栈中元素*/ int top; /*栈指针*/ } SeqStack; 顺序栈被定义为一个结构体类型,有两个域:data和top。 data为一维数组,存储栈中元素,DataType为栈元素的数据类型,可以根据需要而指定为某种具体的类型。 top为int型,它的实际取值范围为0~StackSize-1。 top=-l表示栈空;top=StackSize-1表示栈满。 栈的长度:栈顶指针+1 Q2:顺序表和顺序栈的操作有何区别? Q3:什么叫“向上生成”的栈? “向下生成”又是何意? Q4:为什么要设计堆栈?它有什么独特用途? 编制递归算法: 顺序栈的入栈操作——例如用堆栈存放(A,B,C,D) 顺序栈出栈操作——例如从栈中取出‘B’ 3.1.3 栈的链式存储结构 链栈:栈的链式存储结构。第一个结点为栈顶结点 优点:链式栈无栈满问题,空间可扩充 特点:插入与删除仅在栈顶处执行 栈的基本运算算法: (1)初始化栈运算 功能:创建一个带头结点的链栈,头结点指针ls; 用ls-next=NULL标识栈为空栈。 void InitStack(LinkStack *ls) { ls=(LinkStack *)malloc(sizeof(LinkStack)); ls-next=NULL; } (2) 判断栈空运算 功能:若栈为空则返回值1,否则返 回值0。 int StackE

文档评论(0)

33894522 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档