2-栈-分隔符匹配.doc
文本预览下载声明
分隔符匹配
前提, 目标, 结果
前提: 应该已经掌握如下技能
Stack – 了解栈的实现.
Templates – 模板类的创建
File IO – 基本文件流操作
目标: 促进学生对栈结构以及使用的了解.
结果: 成功完成此次任务学生的收获如下.
进一步熟悉模板类的实现
进一步了解栈的结构与使用
背景
编译器经常需要检查程序的语法错误,但是缺失一个符号的情况频繁出现,比如花括号或者注释符的缺失等等,会导致编译器忽略上百行的代码而找不到真正的语法错误。
这种情况下检查分隔符是否匹配的程序将是一个有用的工具,也就是说,每一个右花括号,方括号,圆括号都必须匹配一个左花括号,方括号,圆括号。比如,序列[()] 是合法的,但是[(]) 就是错误的. 很明显为此写一个很大的程序是不值得的,不过有这么一个工具确实会使检验变得容易很多。
描述
我们可以使用栈来实现这个功能。
申请一个空栈,依次从文件中读字符直到文件结尾。如果这个字符是开的(即起始的,如左括号),将其压入栈中,如果是闭的(即结束的,如右括号),则查看栈是否为空,如果为空,则报错。否则看栈项元素是否与其匹配,如果不匹配,报错。否则,弹出栈底元素。读到文件结尾的时候,如果栈不为空,则报错。
除了括号的匹配,还有考虑注释符(“/**/”)的匹配。如果出现一个“/*”,接下来的所有字符全被忽略,直到“*/”出现。如果文件结束的时候也没有出现“*/”,报错。
程序处理的部分内容如下图所示
任务
为了完成此次任务,你需要定义Stack类以及完成main.cpp 文件,在这个文件中定义了分隔符的匹配。指导步骤列表如下
首先在Stack.h中创建Stack类,你可以通过数组或者链表来实现,但是必须定义成模板类,并且需要包含下列基本操作。
void Pop(): 将栈项元素弹出栈
void Push(const T e): 将一个元素压入栈中
T Top(): 返回栈项元素
bool Isempty() const: 如果栈为空,返回真,否则返回假
int Size() const: 返回栈中元素数量.
接下来创建main.cpp文件,完成分隔符匹配的实现,具体步骤如下
从命令行参数得到文件名,即预检验的文件名,然后使用此文件名调用delimiterMatching函数
完成delimiterMatching函数的定义, 接收一个string类型的参数,即上面所说的文件名。此函数不断从文件中读取一个字符,然后对其进行如上面描述的处理,如果发现错误则所错输出,否则一直到文件结束才结束。
提交
Submit only the following.
Stack.h - your completed class Stack definition
Stack.cpp - if created
main.cpp - your completed delimiter matching file
显示全部