- 1、本文档共28页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第*页 共28页 目录 退出 目录 第*页 共28页 案例二十一 括号嵌套匹配分析器 本案例知识要点 字符栈的使用 类的设计和使用 第*页 共28页 一、案例需求 案例描述 本案例通过编程实现一个括号嵌套匹配分析器。对文本文件中的代码按照括号匹配原则进行分析,并对分析结果进行显示。 与数学领域的概念一样,括号运算先运算里层,再运算外层。下面是一个树形结构的例子: {Root[Branch 00(Leaf 00)[Branch 01(Leaf 01)](Leaf 03)][Branch 02(Leaf 04)(Leaf 05)]} 这种代码的规则是:Root是代码根节点;其下有各个分枝代码段Branch;Branch下可以是分枝代码段Branch,也可以是代码的叶节点Leaf。这种代码的特点是:当一个Branch之下的所有Branch和Leaf都执行完之后,这个Branch代码段才算执行完毕;所有Branch的代码节点执行完毕之后,全部Root代码才执行完毕。 第*页 共28页 案例效果图 括号匹配案例效果如图所示。 括号匹配案例效果图 第*页 共28页 功能说明 利用文件提供的原始代码。例如: {Root[Branch 00(Leaf 00)[Branch 01(Leaf 01)](Leaf 03)][Branch 02(Leaf 04)(Leaf 05)]} 首先按照同类括号匹配的原则检验上面的代码,如果不符合要求则提示错误。 如果正确,则按照树状代码的顺序打印出每对匹配括号中的字符串。 第*页 共28页 二、案例分析 本案例的核心思想是利用数据结构中栈的工作方式,从代码数据文件中读取字符,并放入字符栈中。当读到结束括号‘)’,‘]’,‘}’时,与栈中最后一个起始括号进行比较,若匹配则将两个括号区间中的内容从栈中弹出;若括号不匹配,则报告错误;若读取文件结束而栈不为空,则报告错误;当栈为空而试图读入结束括号时,报告错误。 本案例设计了两个栈,一个栈charArray[MAXCHAR]用于存储树状代码中的全部字符,另一个栈index[MAXSTACK]配合第一个栈记录其中的全部起始括号(包括‘(’、‘[’、‘{’ }在第一个栈中的位置,以便将来读到结束括号(包括‘)’、‘]’、‘}’)时输出每个独立的匹配串,例如Leaf 00、Leaf 01、[Branch 01]等。栈charArray[MAXCHAR]提供了入栈、出栈、判断栈空等栈的操作,但是栈index[MAXSTACK]只是提供了入栈操作,并未提供出栈操作,程序凭借栈顶元素指针即取出了待匹配的起始括号在charArray[MAXCHAR] 栈中的位置。 第*页 共28页 程序运行时,从文件中每读出一个字符即压入栈charArray[MAXCHAR]中,如果该字符是起始括号之一,则立即将其在charArray[MAXCHAR]栈的位置压入第二个栈index [MAXSTACK]中。出栈时借助第二个栈index[MAXSTACK]对字符和index[MAXSTACK]栈的栈顶元素进行比较,如果匹配,则输出其中的字符串,同时修改两个栈的指针,直至文件和栈都为空为止。 案例用到的树状代码存放在data.txt中,如图所示,程序使用标准输入输出文件流对数据文件进行操作。 第*页 共28页 data.txt文件内容 第*页 共28页 三、案例设计 1.类的设计 基于上述分析,本案例需要自定义枚举类型Symbol,并需要设计一个CharStack类。 (1)枚举类型Symbol 枚举类型Symbol的结构如图所示。 (2)CharStack类的设计 CharStack类的设计如图所示。 第*页 共28页 枚举类型Symbol CharStack 类图 第*页 共28页 ① 数据成员 char charArray[MAXCHAR]; 字符栈。 int top; charArray[MAXCHAR]栈的栈顶标记。 int index[MAXSTACK]; 记录全部起始括号在字符栈charArray[MAXCHAR]中的位置。 int indextop; index[MAXSTACK] 栈的栈顶标记。 第*页 共28页 ② 函数成员 CharStack(); 构造函数。 int Push(char ch); 将字符压入栈。 char* Pop(char *str); 弹出字符串。 bool IsEmpty(void); 测试是否为空。 bool IsMatch(char ch1,
文档评论(0)