- 1、本文档共113页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
栈和队列是重要的数据结构 栈和队列是线性表的子集 (是插入和删除受限的线性表) 栈必须按“后进先出”的规则进行操作, 队列必须按“先进先出”的规则进行操作。 和线性表相比,它们的插入和删除操作受更多的约束和限定,故又称为限定性的线性表结构。 从“数据结构”的角度看:它们都是线性结构,即数据元素之间的关系相同。但它们是完全不同的数据类型。除了它们各自的基本操作集不同外,主要区别是对插入和删除操作的限定。 ?3.1栈的类型定义 栈(Stack)是限定只能在表的一 端进行插入和删除操作的线性表。在表 中,允许插入和删除的一端称作“栈顶 (top)”,不允许插入和删除的另一端称作 “栈底(bottom) 。 StackTraverse(S, visit( ))初始条件:栈 S 已存在且非空,visit( ) 为元素的访问函数。操作结果:从栈底到栈顶依次对S的每 个元素调用函数visit( ),一 旦visit( )失败,则操作失败。 这是对栈进行从栈底到栈顶的“遍历”操作,应用较多的场合是,输出栈中所有数据 元素。 3.2 栈的应用举例 由于栈的操作具有后进先出的固有特性,致使栈成为程序设计中的有用工具。凡应用问题求解的过程具有后进先出的天然特性的话,则求解的算法中也必然需要利用栈。 例五、 表达式求值 任何一个表达式都是由操作数(operand)、 运算符(operator)和界限符(delimiter)组成。 操作数可以是常数也可以是被说明为变量 或常量的标识符; 运算符可以分为算术运算符、关系运算符 和逻辑运算符等三类; 基本界限符有左右括弧和表达式结束符等。 如何从后缀式求值? 先找运算符,再找操作数 和顺序表类似,对顺序栈也需要事先为它分配一个可以容纳最多元素的存储空间,base 为这个存储空间的基地址,也即一维数组的地址。 从名称来讲,“栈顶指针”意为指示栈顶元素在栈中的位置,但它的值实际是栈中元素的个数,和顺序表中的 length 值的意义相同。 为了应用方便,这个最大空间的容量应由使用这个顺序栈的程序员决定,它的默认值和顺序表的默认值相同。 4)若当前运算符的优先数高于栈 顶运算符,则进栈;否则,退 出栈顶运算符发送给后缀式; 5)若当前字符是结束符,则自栈 顶至栈底依次将栈中所有运算 符发送给后缀式; 从原表达式求得后缀式的规律为: 6) “(”对它之前后的运算符起隔离 作用,则若当前运算符为“(”时 进栈;7) “)”可视为自相应左括弧开始的 表达式的结束符,则从栈顶起, 依次退出栈顶运算符发送给后缀 式直至栈顶字符为(止。 从原表达式求得后缀式的规律为: void transform(char suffix[ ],char exp[ ] ) { InitStack(S); Push(S, ?#?); p = exp; ch = *p; while (!StackEmpty(S)) { if (!IN(ch, OP)) Pass( Suffix, ch); else { } if ( ch!= ?#? ) { p++; ch = *p; } } // while } // transform … … switch (ch) { case ?(? : Push(S, ch); break; case ?)? : Pop(S, c); while (c!= ?(? ) { Pass( Suffix, c); Pop(S, c) } break; default : while(Gettop(S,c)( precede(c,ch))) { Pass( Suffix, c); Pop(S, c); } if ( ch!= ?#? ) Push( S, ch); break; } // switch OP为操作数的集合,若ch是操作数,则函数IN(ch,OP)的值为“TRUE”。 函数Pass(suffix,ch)的功能是将字符ch复制到数组 suffix 中。 若c(栈
文档评论(0)