第十六次 ccf 201903-2 二十四点
题意:
计算数学表达式的值,
数学表达式的定义: 4个[0-9]表示数字的字符 ,3个[+-x/]表示运算的字符
可以用正则为: ([0-9][+-x/]){3}[0-9]
例如: 5+2/1x3
2-1+7x3
3x3/3x3
找到图片了,不啰嗦了...

这道题只有7个字符,数字只有一位不算太难
先算乘除,后算加减,考试的时候就是这样做的,用stack完美解决
但如果加大难度....
1) 数字允许有多位比如 1314-521*233
2) 再比如如果有括号呢 -1-(1-(-9))
让我们按照函数化的思想逐渐完善我们的代码
(1) 7个字符版本
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
int get_ans (string str) {
stack <int> s;
int flag=;
for (int i=;i<str.size();i++) {
if (str[i]>=''&&str[i]<='') s.push( flag*(str[i]-''));
else if (str[i]=='-' || str[i]=='+') {
if (str[i]=='-') flag=-;
else flag=;
}
else {
int x1=s.top(); s.pop();
i++; // importment !!
int x2=str[i]-'';
if (str[i-]=='/') s.push(x1/x2);
else s.push(x1*x2);
}
}
int sum=;
while (!s.empty()) {
sum+=s.top();
s.pop();
}
return sum;
}
int main ()
{
int T; cin>>T;
while (T--) {
string str; cin>>str;
cout<<get_ans(str)<<endl;
}
return ;
}
2 允许有连续的输入数字: 233*521
我们加入一个输入接口get_num: 如果下一个字符是数字,就一直读下去
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std; int get_num(string str,int &k) {
// 从k开始一直读所有的数字字符
int ans=;
for (;k<str.size();k++) {
if (str[k]>='' && str[k]<='')
ans=ans*+str[k]-'';
else break;
}
k--; // i 此时指向最后一个数字的位置
return ans;
} int get_ans (string str) {
stack <int> s;
int flag=;
for (int i=;i<str.size();i++) {
if (str[i]>=''&&str[i]<='') {
int num=get_num(str,i);
s.push(flag*num);
}
else if (str[i]=='-' || str[i]=='+') {
if (str[i]=='-') flag=-;
else flag=;
}
else {
char ch=str[i];
int x1=s.top(); s.pop();
i++;
int x2=get_num(str,i);
if (ch=='/') s.push(x1/x2);
else s.push(x1*x2);
}
}
int sum=;
while (!s.empty()) {
sum+=s.top();
s.pop();
}
return sum;
} int main ()
{
int T; cin>>T;
while (T--) {
string str; cin>>str;
cout<<get_ans(str)<<endl;
}
return ;
}
3 最难的部分,遇到括号怎么办---
我们也只需要加一个接口
其核心就是把一对括号里面的字符,放入我们之前的接口算出结果,从而达到去除括号的效果
例子: 1*(3-(5-4)) ->1*(3-1)->1*2>2
总之就是把一个问题切分成一个一个小问题
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
string to_str (int x) {
if (x==) return "";
string ans;
bool flag=;
if (x<) {
flag=;
x=-x;
}
while (x) {
ans+=x%+'';
x/=;
}
if (flag) ans+='-';
return ans;
} int get_num(string str,int &k) {
int ans=;
for (;k<str.size();k++) {
if (str[k]>='' && str[k]<='')
ans=ans*+str[k]-'';
else break;
}
k--; // i 此时指向最后一个数字的位置
return ans;
} int get_no_ans (string str) {
stack <int> s;
int flag=;
for (int i=;i<str.size();i++) {
if (str[i]>=''&&str[i]<='') {
int num=get_num(str,i);
s.push(flag*num);
}
else if (str[i]=='-' || str[i]=='+') {
if (str[i]=='-') {
if (i-&&str[i-]=='-') flag=-flag;
else flag=-;
}
else flag=;
}
else {
char ch=str[i];
int x1=s.top(); s.pop();
i++;
int x2=get_num(str,i);
if (ch=='/') s.push(x1/x2);
else s.push(x1*x2);
}
}
int sum=;
while (!s.empty()) {
sum+=s.top();
s.pop();
}
return sum;
} int get_ans (string str) {
str="("+str+")";
stack <char> s;
int ans;
for (int i=;i<str.size();i++) {
if (str[i]==')') {
string tmp;
while (s.top()!='(') {
tmp+=s.top();
s.pop();
}
s.pop();
reverse(tmp.begin(), tmp.end());
int num=get_no_ans(tmp);
//cout<<tmp<<"@@@"<<num<<endl;
tmp=to_str(num);
for (int j=tmp.size()-;j>=;j--) s.push(tmp[j]);
if (i==str.size()-) ans=num;
}
else s.push(str[i]);
}
return ans;
} int main ()
{
int T; cin>>T;
while (T--) {
string str; cin>>str;
cout<<get_ans(str)<<endl;
}
return ;
}
第十六次 ccf 201903-2 二十四点的更多相关文章
- 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...
- javaweb学习总结二十六(response对象的用法二 下载文件)
一:浏览器打开服务器上的文件 1:读取服务器上面的资源,如果在web层,可以直接使用servletContext,如果在非web层 可以使用类加载器读取文件 2:向浏览器写数据,实际上是把数据封装到r ...
- 邁向IT專家成功之路的三十則鐵律 鐵律二十六:IT人閱讀之道-慎選
IT人經常一整天工作回來早已用腦過度,此時收看什麼樣的電視節目,以及閱讀甚麼樣的書籍.聽什麼樣的音樂與有聲書最適合我們,讓我們可以在放鬆之餘,還能夠讓自己內在的心靈與外在的能力繼續成長呢? 身為IT工 ...
- WPF入门教程系列十六——WPF中的数据绑定(二)
三.绑定模式 通过上一文章中的示例,学习了简单的绑定方式.在这里的示例,要学习一下绑定的模式,和模式的使用效果. 首先,我们来做一个简单示例,这个示例是根据ListBox中的选中项,去改变TextBl ...
- (二十六)svn的问题二
上周五请了一天假,电脑放在公司没有带回来,三天的时间都没有看代码,使得我电脑上的东西与svn上相差了太多,因为不一样,所以就要更新同步,因为要更新同步的东西多,便又出了一些问题,也因此对svn有了更进 ...
- Selenium(十六):unittest单元测试框架(二) 初识unittest(续)
1. 认识unittest(续) 关于unittest单元测试框架,还有一些问题值得进一步探讨.你可能在前一章的学习过程中产生了一些疑问,也许你会在本节中找到答案. 1.1 用例执行的顺序 用例的执行 ...
- 邁向IT專家成功之路的三十則鐵律 鐵律二十九 IT人富足之道-信仰
天地自然的循環法則,讓每一個人都必須經歷生.老.病.死.喜.怒.哀.樂,然而至始至終無盡的煩惱總是遠多於快樂,因此筆者深信每一個人在一生當中,都必須要有適合自己的正確信仰,他可以在你無法以物質力量來解 ...
- 邁向IT專家成功之路的三十則鐵律 鐵律二十五:IT人屈辱之道-十倍奉還
現代人普遍火氣都很大,與人爭論時只要有一點點感到屈辱,便會開始大聲反擊,甚至於暴力相向.至於企業中的人事相鬥,則是典型的來個明爭暗鬥,直到成為老闆眼中的紅人,在逐漸掌握了權力之後再來個內部大清洗,不久 ...
- 邁向IT專家成功之路的三十則鐵律 鐵律二十八 IT人教學之道-速戰
所謂IT人教學之道是指可善用在工作之中帶領新人快速上手,或是使用在生活中指導他人迅速學會某項技能的重要經驗.相信大家都有當過新手被指導的體驗,也有擔任過資深的老手帶領新人的經驗.然而您可能不知道,即便 ...
随机推荐
- 干货!一篇文章集合所有Linux基础命令
1 文件{ls -rtl # 按时间倒叙列出所有目录和文件 ll -rttouch file # 创建空白文件rm -rf 目录名 # 不提示删除非空目录(-r:递归删除 -f强制)dos2unix ...
- FastDFS 与 Nginx 实现分布式图片服务器
FastDFS 与 Nginx 实现分布式图片服务器 本人的 Ubuntu18.04 用户名为 jj 点我下载所有所需的压缩包文件 一.FastDFS安装 1.安装 fastdfs 依赖包 ① 解压 ...
- react中的传参方式
react是一个SPA模式,即组件嵌套租,在一个单页面的应用中组件间的数值传递是必不可少的,主要的传参方式大致有一下几种: 1,在挂载的地方给组件传参 ReactDOM.rander(<a na ...
- lr_场景设计之组场景、nmon监控
1.组场景常用于回归 ,可以设置成一个脚本后多久运行下一个脚本: Real-world Schedule和Basic schedule的区别:根据官方文档,这两种模式下,场景中的每个虚拟用户组(可看成 ...
- THUWC2019游记
Day -INF 听说自己苟进了THUWC,然而我还什么都不会啊,这样去了不得被吊打. 随便列了几个WC前的计划,然而到最后一个都没有完成,感觉学习效率好低啊,周围一众神仙天天吊打我. Day 0 坐 ...
- asp.net IHttpHandler浅析
在asp.net程序中,我们可以通过配置url的path路径的方式,将某个path路径下的请求交给指定的IHttpHandler去处理,这便是对request请求进行编程. 一.新建一个framewo ...
- 动态规划Dynamic Programming
动态规划Dynamic Programming code教你做人:DP其实不算是一种算法,而是一种思想/思路,分阶段决策的思路 理解动态规划: 递归与动态规划的联系与区别 -> 记忆化搜索 -& ...
- Judy Beta 阶段整体计划
Judy Beta 总体规划 经过Alpha阶段的人员变动,Judy组成员如下:Manli Shu, Yuechen Wang, Zhiqi Lin, Yu Xing. 前Alpha阶段PM离职. 人 ...
- error #10234-D: unresolved symbols remain error #10010: errors encountered during linking;
error #10234-D: unresolved symbols remain error #10010: errors encountered during linking;: include ...
- HTML中data-* 属性
使用 data-* 属性来嵌入自定义数据: <ul><li data-animal-type="bird">Owl</li><li dat ...