【练习3.18】用下列语言编写检测平衡符号的程序

a.Pascal ( begin/end, ( ), [ ], { } )。

b.C语言( /* */, ( ), [ ], { })。

c.解释如何打印出错信息

Answer:

a和b本质是一样的,就写了b小题即C语言的检测。

基本思想就是用栈,除了注释符号有一点点麻烦要查看连续两个字符,其它的几组都是很轻松愉快。

具体的细节都放到注释里了,所以在文章上没必要说太多。

这题测试代码就不放了,基本就是自己拿个文本文件改来改去,在main函数里面就三行,总之是实测是能通过的。

 //练习3.18新增,检查语言平衡符号
void checklang(ifstream &ifile)
{
if (ifile)
{
Stack<char> check;
//避免空栈导致getfirst()抛出异常
check.push('!');
//string testall("()[]{}*/");
string pushin("([{*");
string popout(")]}/");
char prev = '\0';
char curr;
ifile >> curr;
while (!ifile.eof())
{
//如果栈首为注释符,则除非出现反注释,否则全部跳过
if (check.getfirst() == '/')
{
if (prev == '*' && curr == '/')
check.pop();
}
else
{
//如果检测到开始标志
if (pushin.find(curr) != string::npos)
{
//如果是单对应符则直接入栈
if (curr != '*')
check.push(curr);
//如果是注释则入栈
else if (prev == '/')
check.push('/');
//否则,必然有curr == '*', 而prev != '/',不作处理继续运行
}
//如果检测到结束标志
else if (popout.find(curr) != string::npos)
{
//如果是三个单对应符号
//则可对应即弹出,不可对应则跳出并将报错
if (curr == ')')
{
if (check.getfirst() == '(')
check.pop();
else
break;
}
else if (curr == ']')
{
if (check.getfirst() == '[')
check.pop();
else
break;
}
else if (curr == '}')
{
if (check.getfirst() == '{')
check.pop();
else
break;
}
//如果是反注释
else if (prev == '*')
{
if (check.getfirst() == '/')
check.pop();
else
break;
}
//如果不是反注释则不做任何操作
}
}
//读取下一个字符
prev = curr;
ifile >> curr;
}
//如果curr未到达文件尾
//必然是因为错误的单符号对应而跳出循环
if (!ifile.eof())
{
cout << curr << " and " << check.getfirst() << endl;
cout << "Incorrect pop!" << endl;
}
//如果到达文件尾后,栈首不是初始的'!'
//必有后半平衡符缺失
else if (check.getfirst() != '!')
cout << "Missing ending!" << endl;
else
cout << "Success" << endl;
check.clear();
}
else
cout << "Cannot find stream!" << endl;
}

【Weiss】【第03章】练习3.18:检查平衡符号的更多相关文章

  1. 第03章_基本的SELECT语句

    第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖.在这几十年里,无数的技术.产业在这片江湖 ...

  2. 第03章 AOP前奏

    第03章 AOP前奏 提出问题 ●情景:数学计算器 ●要求 ①执行加减乘除运算 ②日志:在程序执行期间追踪正在发生的活动 ③验证:希望计算器只能处理正数的运算 ●常规实现 ●问题 ○代码混乱:越来越多 ...

  3. suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件

    文章目录 1.3.部署flannel网络 1.3.0.下载flannel二进制文件 1.3.1.创建flannel证书和私钥 1.3.2.生成flannel证书和私钥 1.3.3.将pod网段写入et ...

  4. Leetcode:面试题 04.04. 检查平衡性

    Leetcode:面试题 04.04. 检查平衡性 Leetcode:面试题 04.04. 检查平衡性 Talk is cheap . Show me the code . /** * Definit ...

  5. 【Weiss】【第03章】增补附注

    基本上每章到增补附注这里就算是结束了. 根据设想,每章的这一篇基本上会注明这一章哪些题没有做,原因是什么,如果以后打算做了也会在这里补充. 还有就是最后会把有此前诸多习题的代码和原数据结构放整理后,以 ...

  6. 【Weiss】【第03章】练习3.25:数组模拟队列

    [练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...

  7. 【Weiss】【第03章】练习3.16:删除相同元素

    [练习3.16] 假设我们有一个基于数组的表A[0,1...N-1],并且我们想删除所有相同的元素. LastPosition初始值为N-1,但应该随着相同元素被删除而变得越来越小. 考虑图3-61中 ...

  8. 【Weiss】【第03章】练习3.26:双端队列

    [练习3.26] 双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作: Push(X,D):将项X插入到双端队列D的前端. Pop(D):从双端队列D中删除前端项并返回. ...

  9. 【Weiss】【第03章】练习3.22、3.23、3.24:无代码题,栈的思考题

    [练习3.22] a.提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin 返回该数据结构的最小元素,所有操作在最坏情况下的运行时间都是O(1). b.证明,如果 ...

随机推荐

  1. js类型比较

    比较数据类型做比较的三种方法typeofinstanceofObject.prototype.toString.call() javascript七大类型 javascript的数据类型分为两类:原始 ...

  2. Maximum Value(CodeForces - 484B)

    Maximum Value Time limit 1000 ms Memory limit 262144 kB You are given a sequence a consisting of n i ...

  3. [Python_scrapy图片爬取下载]

    welcome to myblog Dome地址 爬取某个车站的图片 item.py 中 1.申明item 的fields class PhotoItem(scrapy.Item): # define ...

  4. 下一代网际协议IPv6

    下一代网际协议IPv6 一.解决 IP 地址耗尽的措施 从计算机本身发展以及从因特网规模和网络传输速率来看,现在 IPv4 已很不适用. 最主要的问题就是 32 位的 IP 地址不够用. 在 2019 ...

  5. python爬虫-提取网页数据的三种武器

    常用的提取网页数据的工具有三种xpath.css选择器.正则表达式 1.xpath 1.1在python中使用xpath必须要下载lxml模块: lxml官方文档 :https://lxml.de/i ...

  6. linux svn 安装(支持http访问)

    1.安装svn yum install -y subversion 2.查看svn版本 svn --version 3.创建仓库 mkdir -p /opt/java/repos cd /opt/ja ...

  7. Hibernate和Mybatis的工作原理以及区别

    一.Mybatis的工作流程图 (1).原理详见: MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一 ...

  8. 一起了解 .Net Foundation 项目 No.13

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. MVVM Light To ...

  9. MySQL占用CPU超过百分之100解决过程

    本文转载自: https://www.93bok.com 访问网页504 Gateway Time-out,登陆服务器查看,内存正常,CPU使用率达到了400%,因为是4核,所以到了400%,几乎全部 ...

  10. 【译文连载】 理解Istio服务网格(第六章 可观测性)

    全书目录 第一章 概述 第二章 安装 第三章 流控 第四章 服务弹性 第五章 混沌测试 ​本文目录 第6章 可观测性 6.1 分布式调用链跟踪(tracing) 6.1.1 基本概念 6.1.2 Ja ...