题意:

计算数学表达式的值,

数学表达式的定义: 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 二十四点的更多相关文章

  1. 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...

  2. javaweb学习总结二十六(response对象的用法二 下载文件)

    一:浏览器打开服务器上的文件 1:读取服务器上面的资源,如果在web层,可以直接使用servletContext,如果在非web层 可以使用类加载器读取文件 2:向浏览器写数据,实际上是把数据封装到r ...

  3. 邁向IT專家成功之路的三十則鐵律 鐵律二十六:IT人閱讀之道-慎選

    IT人經常一整天工作回來早已用腦過度,此時收看什麼樣的電視節目,以及閱讀甚麼樣的書籍.聽什麼樣的音樂與有聲書最適合我們,讓我們可以在放鬆之餘,還能夠讓自己內在的心靈與外在的能力繼續成長呢? 身為IT工 ...

  4. WPF入门教程系列十六——WPF中的数据绑定(二)

    三.绑定模式 通过上一文章中的示例,学习了简单的绑定方式.在这里的示例,要学习一下绑定的模式,和模式的使用效果. 首先,我们来做一个简单示例,这个示例是根据ListBox中的选中项,去改变TextBl ...

  5. (二十六)svn的问题二

    上周五请了一天假,电脑放在公司没有带回来,三天的时间都没有看代码,使得我电脑上的东西与svn上相差了太多,因为不一样,所以就要更新同步,因为要更新同步的东西多,便又出了一些问题,也因此对svn有了更进 ...

  6. Selenium(十六):unittest单元测试框架(二) 初识unittest(续)

    1. 认识unittest(续) 关于unittest单元测试框架,还有一些问题值得进一步探讨.你可能在前一章的学习过程中产生了一些疑问,也许你会在本节中找到答案. 1.1 用例执行的顺序 用例的执行 ...

  7. 邁向IT專家成功之路的三十則鐵律 鐵律二十九 IT人富足之道-信仰

    天地自然的循環法則,讓每一個人都必須經歷生.老.病.死.喜.怒.哀.樂,然而至始至終無盡的煩惱總是遠多於快樂,因此筆者深信每一個人在一生當中,都必須要有適合自己的正確信仰,他可以在你無法以物質力量來解 ...

  8. 邁向IT專家成功之路的三十則鐵律 鐵律二十五:IT人屈辱之道-十倍奉還

    現代人普遍火氣都很大,與人爭論時只要有一點點感到屈辱,便會開始大聲反擊,甚至於暴力相向.至於企業中的人事相鬥,則是典型的來個明爭暗鬥,直到成為老闆眼中的紅人,在逐漸掌握了權力之後再來個內部大清洗,不久 ...

  9. 邁向IT專家成功之路的三十則鐵律 鐵律二十八 IT人教學之道-速戰

    所謂IT人教學之道是指可善用在工作之中帶領新人快速上手,或是使用在生活中指導他人迅速學會某項技能的重要經驗.相信大家都有當過新手被指導的體驗,也有擔任過資深的老手帶領新人的經驗.然而您可能不知道,即便 ...

随机推荐

  1. ClientDataSet应用

    最近维护一个项目,里面用到ClientDataSet,由于之前接触ClientDataSet比较少,所以这个星期补了一下关于ClientDataSet的知识,并在此记录下我所了解到的并应用到实际项目中 ...

  2. hdu1856

    Mr Wang wants some boys to help him with a project. Because the project is rather complex, the more ...

  3. c#实现数据库的备份

    在.NET开发后天管理系统的时候,数据库的备份功能是必须实现的一块,而在数据库备份方面一句sql语句就可以搞定了,那就是<Backup Database 数据库名To disk='路径\数据库备 ...

  4. Python-接口自动化(九)

    python操作Excel处理测试数据(九) (十)python操作Excel读/写测试数据 1.夹心饼干 setUp:在每一条测试用例执行之前执行 tearDown:在每一条测试用例执行之后执行 上 ...

  5. 活代码LINQ——06

    一.模块代码 ' Fig. 9.4: LINQWithArrayOfObjects.vb ' LINQ to Objects using an array of Employee objects. M ...

  6. Visual Studio+VAssistX自动添加注释,函数头注释,文件头注释

    转载:http://blog.csdn.net/xzytl60937234/article/details/70455777 在VAssistX中为C++提供了比较规范注释模板,用这个注释模板为编写的 ...

  7. java基础2(二)

    Servlet 注意: servletConfig可以获取配置文件(xml文件)中配置的servlet对象的初始化参数. url-pattern 缺省servlet 注意:tomcat目录下有一个默认 ...

  8. python 列表list相关知识

    List的元素可以是Python的任意数据类型(Boolean,Number,String,List,Dict,Set……) List同样可以使用索引和切片,切片得到的结果也是列表. print(li ...

  9. [.NET] 使用ValidationContext快速进行模型资料的验证

    在进行WebAPI功能开发的时候,一般传统的验证资料是否合法的方式,都是透过if/else的方式进行判断若是使用ValidationContext,就可以省去很多自行撰写程式码的工作 要使用Valid ...

  10. 20175224 2018-2019-2 《Java程序设计》第四周学习总结

    教材学习内容总结 子类的定义 class 子类名 extends 父类名 { ... } 子类继承性 子类继承父类的成员变量.方法.成员变量可以被子类中自己定义的任何实例方法操作:继承的方法可以被子类 ...