第十六次 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人教學之道是指可善用在工作之中帶領新人快速上手,或是使用在生活中指導他人迅速學會某項技能的重要經驗.相信大家都有當過新手被指導的體驗,也有擔任過資深的老手帶領新人的經驗.然而您可能不知道,即便 ...
随机推荐
- Vuex学习笔记(-)安装vuex
什么是Vuex? vuex是一个专门为vue.js应用程序开发的状态管理模式.即data中属性同时有一个或几个组件同时使用,就是data中共用的属性. 安装vuex(前提是已经安装好vue-cli脚手 ...
- winfrom程序文本框第一次选中问题
想实现这样的功能: 就是在panel中的文本框,当第一次点击文本框时,全选文本框的内容:再次选择时,可以全选,也可以部分选中, 可是文本框总是从左全部选中,还不能从右边选择,在Enter或Down事件 ...
- oracle数据库 查看被锁定表及解锁方法
最近做项目,遇到了更新超时的问题,反复检查数据都正常,纳闷完了忽然想到是不是表被锁定了,一看果然,解决办法如下: --锁表查询语句 SELECT object_name, machine, s.sid ...
- ubuntu14/16 安装python3-opencv3_百度经验
http://jingyan.baidu.com/article/e4511cf348dac52b845eafc8.html
- IIS7.5修改asp的文件上传限制方法
第一.IIS7.5修改asp的文件上传限制方法 1.打开IIS 2.打开面板中的应用程序开发 asp 3.找到最后的限制属性 4.修改其中的最大请求实体主体限制的值:默认为200000字节,等于195 ...
- JAVA基础50题
package package0530; import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;imp ...
- kafka producer 0.8.2.1 示例
package test_kafka; import java.util.Properties; import java.util.concurrent.atomic.AtomicInteger; i ...
- Quartz 2.2 动态添加、修改和删除定时任务
QuartzManager.Java 动态添加.修改和删除定时任务管理类 import org.quartz.CronScheduleBuilder; import org.quartz.CronTr ...
- 修改hbuilder背景颜色为护眼模式
复制以下代码,保存为.tmTheme文件导入HBuilder <?xml version="1.0" encoding="UTF-8"?> < ...
- Flutter 卡在 package get 的解决办法
今天在尝试使用Flutter 的时候,需要使用一个第三方库 修改了 pubspec 文件之后,AS 像往常一样提示 需要 package get. 之前都挺正常,不知道今天怎么了. 一直处在 Runn ...