- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算机软件技术基础 教 师:曾晓东 电 话E_mail: zengxiaodong@263.net 第三章 线性结构 3.1 线性表 3.2 栈和队列 3.2.1、栈 3.2.2、队列 3.3 数组 3.2.1 栈 一、栈的定义 二、栈的运算 三、栈的存储结构及算法 四、栈的应用 一、栈的定义 栈是限定只能在表的一端进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)。 设栈s=(a1,a2,...,an),a1称为栈底元素,an称为栈顶元素。 栈中元素按a1,a2,...,an次序进栈,又按an,...,a2,a1次序退栈。因此栈的操作特点是:后进先出(LIFO);n=0时称为空栈。 二、栈的运算 1.置空栈 SETNULL(S)将栈S置成空栈 2.判空栈 EMPTY(S) 若栈S是空栈,返回“真”, 否则返回“假” 3.进栈 PUSH(S,x) 在栈S顶部插入(压入)元素x 4.出栈 POP(S) 若栈S不空,删除(弹出)顶部元素 5.取栈顶 TOP(S) 取栈顶元素,并不改变栈中内容 三、栈的存储结构及算法 1.顺序栈 1)类型定义 顺序栈用向量作为栈的存储结构,可用一维数组s[1:m]表示。其中m表示栈的最大容量。用一个简单变量top来指示栈顶位置,称为栈顶指示器。top=0表示栈空,top=m表示栈满。 类型定义 struct seqstack{ elemtype stack[MAXSIZE]; int top; }; 三、栈的存储结构及算法 2)顺序栈初始化 ⑴ 操作: 建一空栈,将栈顶位设置为-1 ⑵ 接口: 入口和出口参数均为堆栈指针s ⑶ 算法描述:令栈顶位 s-top为-1 ⑷ 函数实现: void inistack(seqstack s){ s.top = -1; } 三、栈的存储结构及算法 3)进栈算法 ⑴ 操作: 先将栈顶位置加一 将数据放入栈顶位置 ⑵ 接口: 入口参数:堆栈指针s,新数据元素x 出口参数: 堆栈指针s 函数值: 成功则返回 1 ( 用true表示), 失败则返回 0 ( 用false表示) 三、栈的存储结构及算法 (3)算法描述 三、栈的存储结构及算法 (4) 函数实现 int push (seqstack s, elemtype x){ if(s.top = MAXSIZE-1) return (false); s.top++; s.stack[s.top]=x; return (true); } 三、栈的存储结构及算法 4)出栈算法 (1) 操作 取栈顶位置内数据. 再将栈顶位置减一 (2) 接口 入口参数:堆栈指针s 出口参数: 堆栈指针s 函数值: 成功则返回数据元素x, 失败则返回NULL (3) 算法描述 三、栈的存储结构及算法 (4) 函数实现 elemtype pop (seqstack s) { if(s.top 0) return NULL; s.top--; return s.stack[s.top+1]; } 三、栈的存储结构及算法 5)双栈操作 顺序栈的缺点:栈满后不能进行进栈操作,否则将产生“上溢”错误 同时使用同类的两个栈,充分利用剩余空间 两栈共用一个存储空间,分别从两端向中间增长 三、栈的存储结构及算法 2.链栈 链栈是用链表作为栈的存储结构,top为栈顶指针,指示栈顶元素位置,若top=NULL,则表示栈空。链栈一般不会出现上溢,除非内存中已不存在可用空间。 使用单链表,不设头结点 插入和删除仅在表头一端 栈顶top :指始结点,浮动 空栈用 top=NULL 实现 链栈结点动态分配,空间无限 链栈定义与单链表相同 struct link *top; 四、栈的应用 表达式求值 1)高级语言中的表达式是用人们熟悉的公式形式书写的,编译系统要根据表达式的运算顺序将它翻译成机器指令序列。 2)为解决运算顺序问题,把运算符分成若干等级,称为优先数。 3)为进行表达式的翻译,需设立两个栈,分别存放操作数(NS)和运算符(OS)。 四、栈的应用 4)首先在OS中放入表达式结束符“#”,然后自左至右扫描表达式,根据扫描的每一个符号作如下不同处理: ① 若为操作数,将其压入NS栈 ② 若为运算符,需看当前OS的栈顶元素: 若OS栈顶运算符小于或等于当前运算符的优先数,则将当前运算符压入OS栈。 若OS栈顶运算符大于当前运算符的优先数,则从NS栈中弹出两个操作数,设为x、y,再从OS栈中弹出一个运算符,设
文档评论(0)