化学方程式的配平检验

第一次去考,有些紧张,第三题本来很简单的,愣是没写出来,放假了有空写了写,自我感觉可读性还可以。
因为ccf官网上还没有开放模拟,我就自己写了个.txt文件检验一下,基本要求都满足了。
主要用了unordered_map作为元素记录,stringstream作为字符串分割工具。

提示

经过大佬提示,尽量用面向过程的思想,少用class。

更新

增加了嵌套括号的判断(增加了一个vector数组,记录每层括号外的数字)运行截图如下:

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <sstream>using namespace std;class elements{private:unordered_map<string, int> record;  // 记录元素个数vector<int> stack;  // 记录嵌套括号外的数字bool islower(char& c){return c >= 'a' && c <= 'z';}bool isdigit(char& c){return c >= '0' && c <= '9';}
public:elements(vector<string> words){stack.push_back(1);int times = 1;  // 记录当前的元素需要乘的倍数// int outsideNum = 1;  // 括号外的数字(现改为局部变量)int inside = 0;  // 记录括号嵌套的层次int totalNum = 0; // 化学式的系数for(auto word : words){for(int i = 0; i < word.size() && isdigit(word[i]); i++){  // 获取化学式的系数totalNum = totalNum * 10 + word[i] - '0';}if(totalNum == 0) // 没有系数则默认为1totalNum = 1;for(int i = word.size() - 1; i >= 0; i--){char curch = word[i];if(isdigit(curch)){// times = curch - '0'; // 之前的写法缺少对括号外多位数字的判断,经评论区兄弟提醒,现做订正times = curch - '0';int tc = 1;while (i > 0 && isdigit(word[i - 1])) {times += (word[i-1] - '0') * pow(10, tc);tc++;i--;}if(word[i - 1] == ')'){ // 出现的数字属于括号内的元素// outsideNum = times;if(inside == 0){ // 如果还没有嵌套,目前仅出现了单层括号stack.pop_back();}stack.push_back(times);times = 1;}} else if (curch == ')'){inside++;} else if (curch == '('){inside--;// outsideNum = 1;stack.pop_back();if(inside == 0){stack.push_back(1);}} else if (islower(curch)){string temp_ele;temp_ele.push_back(word[i - 1]);temp_ele.push_back(curch);int outsideNum = 1;for(auto n : stack){outsideNum *= n;}record[temp_ele] += times * outsideNum * totalNum;times = 1;i--;} else {  // 单个的元素string temp_ele;temp_ele.push_back(curch);int outsideNum = 1;for(auto n : stack){outsideNum *= n;}record[temp_ele] += times * outsideNum * totalNum;times = 1;}}totalNum = 0;  // 记得清零,对下一个化学式判断times = 1;}for(const auto& r : record){cout << r.first << " : " << r.second << endl;}}int operator[](string elem){return record[elem];}bool operator==(elements& rightElement){for(const auto& r : record){if(r.second != rightElement[r.first])return false;}return true;}
};bool isbalance(string input){vector<string> leftwords;vector<string> rightwords;std::stringstream ss(input);vector<string> line;string temp;while(getline(ss, temp, '=')){  // 把整个表达式分为左右两个部分line.push_back(temp);}ss = stringstream(line[0]);while(getline(ss, temp, '+')){leftwords.push_back(temp);}ss = stringstream(line[1]);while(getline(ss, temp, '+')){rightwords.push_back(temp);}cout << "the left elements number:\n";elements left(leftwords);cout << "the right elements number:\n";elements right(rightwords);return left == right;
}int main()
{int equanum;cin >> equanum;string result;for(int i = 0; i < equanum; i++){string input;cin >> input;bool res = isbalance(input);result.push_back(res?'Y':'N');}for(auto c : result)cout << c << endl;return 0;
}

运行截图(最后的两个Y是判断的结果)

CCF-CSP题解 201912-3化学方程式相关推荐

  1. CCF CSP 题解汇总

    前言 本文汇总了本人所有的CSP题解,方便总览. 202209 202209 题解 分数 1 如此编码 1 如此编码 100 2 何以包邮? 2 何以包邮? 100 3 防疫大数据 4 吉祥物投票 4 ...

  2. CCF CSP认证考试题解目录

    由于本人的书籍<算法详解(C++11 语言描述)>已经出版,为了降低题解的维护难度,有关CCF CSP考试的所有题解的更新将全部在书籍的配套仓库进行,CSDN博客中不再进行任何题解的更新. ...

  3. CCF CSP认证历年真题 满分代码(持续更新中)

    目标 在接下来的半年到一年时间内,补全CCF认证历年真题(A-D)的满分代码(E题随缘). 考虑到CCF认证这个东西是可以混分的,我计划对D.E题额外增加部分分代码,或许有助于不同层次的选手备赛. 除 ...

  4. CCF CSP认证菜鸟刷题日志

    CCF CSP菜鸟刷题日志(c/c++) 本萌新写给自己看的,要是有大佬路过,请多多指教orz 立个flag:每日一更,至201903 9月15ccf csp,冲鸭! 今天(2019.8.18)起每天 ...

  5. ccf csp认证考试的历年题集汇总

    1.CCF历年试题解答_按题序 2.CCF认证考试题解目录 3.CCF CSP入坑指南 4.ccf 认证历年试题解答 5.CCF认证历年真题 _无题意 6.CCF-CSP认证备考要点 6.CCF认证历 ...

  6. CCF CSP 201609-2 火车购票

    题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...

  7. 计算机能力挑战赛_蓝桥杯、PAT、CCF CSP、团体程序设计天梯赛、传智杯、计算机能力挑战赛、软考等大学生编程比赛/考试介绍...

    介绍7个适合普通大学生参加的编程比赛/考试(注:有的比赛如蓝桥杯有多种赛别,本文仅介绍其中的程序设计/编程比赛). 编程入门书籍推荐<算法笔记>,内容详细易懂,对新手非常友好,描述语言为C ...

  8. 以CCF CSP认证为抓手,积极探索软件基础能力递进式培养体系

    原文链接:以CCF CSP认证为抓手,积极探索软件基础能力递进式培养体系 发布单位:学会      发布时间:2017-01-20 16:16 作者:陆建峰    余立功 摘要:为提升计算机专业类学生 ...

  9. ccf csp寻宝!大冒险!(C语言)

    ccf csp寻宝!大冒险! 题目背景 暑假要到了.可惜由于种种原因,小 P 原本的出游计划取消.失望的小 P 只能留在西西艾弗岛上度过一个略显单调的假期--直到-- 某天,小 P 获得了一张神秘的藏 ...

  10. 【CCF CSP】【Python】【201903-1】小中大

    [CCF CSP][Python][201903-1] 小中大 题目要求 代码实现 主要方法 提交验证 题目要求 代码实现 1.初始版(又名完全原创版.欠优化版.无法体现"人生苦短,我用PY ...

最新文章

  1. ios app的真机调试与发布配置
  2. 64位处理器_电脑操作系统的32位和64位有什么区别
  3. 西安石油大学计算机基础考试试题,2017年西安石油大学计算机学院824计算机组成原理考研题库...
  4. r语言 fread函数参数_R语言 第4章 初级绘图(6)
  5. JS关键字和保留字汇总(小记)
  6. 数据仓库建模与ETL实践技巧
  7. 超好看的自适应蜘蛛池官网首页源码
  8. Java 找到并返回一组字符串中第一个不为空的字符串
  9. LeetCode 654 最大二叉树
  10. 2018网易校招前端笔试考后总结
  11. 线性代数知识荟萃(3)——行列式
  12. FileZilla Client 3.26.1 发布,FTP 解决方案
  13. 关于MPU6050姿态解算的一阶互补滤波方法(从原理到代码实现)
  14. Retinex低光照图像增强
  15. minigui学习笔记四
  16. 我的sulley安装过程
  17. 汉语属于哪个语系_汉语语族的所属语系
  18. 小程序如何开通微信支付?
  19. php 怎么远程包含,利用PHP应用程序中的远程文件包含(RFI)并绕过远程URL包含限制...
  20. 聊聊 Kafka:协调者 GroupCoordinator 源码剖析之 FIND_COORDINATOR

热门文章

  1. Centos 9 Stream + Virtualbox Additions ISO 无法安装
  2. 细胞间的无菌操作注意事项
  3. 基于MATLAB的opti Toolbox的工具包详细安装教程
  4. Android自带组件之Gallery 实现3D画廊效果
  5. windows系统下配置PCL1.8.0和VS2013
  6. AQS核心流程解析-acquire方法
  7. zookeeper 动物管理员
  8. Django 序列化和反序列化(九)
  9. uniapp map 点聚合 聚合点样式修改
  10. Redis双写一致性