【练习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页面--年份自动增加

    ) { document.write("-" + new Date().getFullYear()); }</script> // 大于2017年自动加上 - 年份

  2. ibator使用

    一.ibator是一个ibatis的代码生成工具,它能根据数据表自动生成javabean.sqlmap. ibator的官方地址是 http://ibatis.apache.org/ibator.ht ...

  3. 如何设计一个LRU Cache

    如何设计一个LRU Cache? Google和百度的面试题都出现了设计一个Cache的题目,什么是Cache,如何设计简单的Cache,通过搜集资料,本文给出个总结. 通常的问题描述可以是这样: Q ...

  4. [Golang]字符串拼接方式的性能分析

    本文100%由本人(Haoxiang Ma)原创,如需转载请注明出处. 本文写于2019/02/16,基于Go 1.11.至于其他版本的Go SDK,如有出入请自行查阅其他资料. Overview 写 ...

  5. CPU网卡亲和绑定

    #!/bin/bash # # Copyright (c) , Intel Corporation # # Redistribution and use in source and binary fo ...

  6. mongodb 4.0配置认证模块

    use admin db.createUser({user:"root",pwd:"xxx",roles:[{role:"root",db: ...

  7. nGrinder 介绍与安装

    nGrinder是基于Grinder开源项目,但由NHN公司的nGrinder开发团队进行了重新设计和完善(所以叫做nGrinder). 它是由一个controller和连接它的多个agent组成,用 ...

  8. 微信小程序配置二

    tabBar 客户端窗口底部的tab页面切换,只能配置最好两个.最多5个tab 属性说明: 属性 类型 必填 默认值 描述 color HexColor 是 tab上的文字默认颜色 selectedC ...

  9. android framework 之JNI

    Java Native Interface ( JN I)是Java本地接口,所谓的本地(native) —般是指C/C++ ( 以下统称C)语言.当使用Java进行程序设计时,一般主要有三种情况需要 ...

  10. Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面

    通过本系列教程的前几章内容(API开发.数据访问).我们已经具备完成一个涵盖数据存储.提供HTTP接口的完整后端服务了.依托这些技能,我们已经可以配合前端开发人员,一起来完成一些前后端分离的Web项目 ...