题意:

计算数学表达式的值,

数学表达式的定义: 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. 初学python类编的一个求矩形小程序

    简单的程序不简单,里面包含类定义类,传参,初始化,方法调用,创建实例,格式输出.主要在python中随时定义变量随时用,我这道题题想好久就是我初识类,传参,不是所有参数都的加单引号.简单的东西,复杂话 ...

  2. python学习------socket编程

    一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...

  3. Python-接口自动化(八)

    unittest单元测试框架(八)    (九)unittest 1.基本概念 python自带的unittest单元测试框架不仅可以适用于单元测试,也适用于WEB自动化测试用例的开发与执行,uint ...

  4. typescript 关于class属性类型定义被属性默认值覆盖的问题及解决方式

    问题来源于 React.component的第二个参数的类型定义问题,我构建了以下简化demo,方便描述问题: class P<STATE> { public state: STATE; ...

  5. oracle数据库 查看被锁定表及解锁方法

    最近做项目,遇到了更新超时的问题,反复检查数据都正常,纳闷完了忽然想到是不是表被锁定了,一看果然,解决办法如下: --锁表查询语句 SELECT object_name, machine, s.sid ...

  6. Python语言:Day9练习题及其答案

    1.使用while循环输出1,2,3,4,5,6, 8,9,10 #!/usr/bin/python3 n = 1 while n <= 10: if n != 7: print(n) else ...

  7. JavaWeb开发流程

  8. CentOS6.5 - yum对Mysql的安装与配置

    一.mysql的安装 1.查看是否安装mysql [root@localhost ~]# rpm -qa | grep mysql 如果有进行卸载(以下三种方式选一种即可): -.el6.x86_64 ...

  9. Vue源码之 diff Vnode

    其实现在这个还没看懂,只能是初步看一下 _update调用__patch__方法,如果prevVnode(也就是oldVnode),旧vnode和新vnode对比,如果没有,就vnode就是vm.$e ...

  10. Shiro-Spring 授权操作

    Subject进行Shiro的授权操作,首先委托给Security Manager,在由Security Manager 委托给Authenticator,由Authenticator授权器进行真正的 ...