二十四点
来源:CCF
背景
二十四点是一款著名的纸牌游戏,其游戏的目标是使用 3 个加减乘除运算使得 4张纸牌上数字的运算结果为 24。
题目
定义每一个游戏由 4 个从 1-9 的数字和 3 个四则运算符组成,保证四则运算符将数字两两隔开,不存在括号和其他字符,运算顺序按照四则运算顺序进行。其中加法用符号 + 表示,减法用符号 - 表示,乘法用小写字母 x 表示,除法用符号 / 表示。在游戏里除法为整除,例如 2 / 3 = 0,3 / 2 = 1, 4 / 2 = 2。
老师给了你 n 个游戏的解,请你编写程序验证每个游戏的结果是否为 24 。
输入
从标准输入读入数据。第一行输入一个整数 n,从第 2 行开始到第 n + 1 行中,每一行包含一个长度为 7的字符串,为上述的 24 点游戏,保证数据格式合法。
输出
输出到标准输出。
包含 n 行,对于每一个游戏,如果其结果为 24 则输出字符串 Yes,否则输出字符串 No。
输入样例
10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5
输出样例
Yes
No
No
Yes
Yes
No
No
No
Yes
Yes
样例解释
9+3+4 × 3 = 24
5+4 × 5 × 5 = 105
7 − 9 − 9+8= −3
5 × 6/5 × 4 = 24
3 + 5 + 7 + 9 = 24
1 × 1+9 − 9=1
1 × 9 − 5/9 = 9
8/5 + 6 × 9 = 55
6 × 7 − 3 × 6 = 24
6 × 4 + 4/5 = 24
提示

解题思路:
表达式中只含有+、-、x、/ 四种运算,我们可以简单地用栈来模拟计算。
使用两个栈,分别是数字栈和操作符号栈,过程是这样的,顺序遍历表达式,如果遇到的是数字,压入数字栈,如果遇到的是操作符号,压入操作符号栈。
由于x、/ 的优先级较高,所以当遇到乘法和除法时,我们可以直接计算结果,然后把计算结果压入数字栈。
再者,减法的结合性是从左向右的,所以我们可以做一个简单转换,将所有的减法变为加法。当所有的操作符号都被处理过后,数字栈中的数就是结果了。

记忆要点:数字栈与符号栈、优先级高的直接处理、对左结合的减法进行转换

AC代码:

#include<iostream>
#include<stack>
#include<stdio.h>
using namespace std;
stack<int> num;
stack<char> s;
int main() {int n;cin >> n;getchar();//吃掉回车while (n--) {if (!num.empty())num.pop();if (!s.empty())s.pop();char ch;ch = getchar();int a, b; char op;while (ch != '\n') {if (ch >= '0' && ch <= '9') {if (!s.empty() && s.top() == '-') {//符号栈顶为减号 则对减法适当处理num.push((ch - '0')*(-1));}else num.push(ch - '0');if (!s.empty() && (s.top() == 'x' || s.top() == '/')) {//乘法和除法则直接计算b = num.top(); num.pop();a = num.top(); num.pop();op = s.top(); s.pop();if (op == 'x')num.push(a*b);else num.push(a / b);}}else s.push(ch);ch = getchar();}while (!s.empty()) {//对剩下的操作符进行处理 这里可以全部认为是加法操作符 b = num.top(); num.pop();a = num.top(); num.pop();s.pop();num.push(a + b);}int tmp = num.top(); num.pop();if (tmp == 24)cout << "Yes" << endl;else cout << "No" << endl;}return 0;
}

CCF 201903-2 二十四点 用栈模拟简单计算器相关推荐

  1. CCF-CSP 201903-2 二十四点 Python语言 模拟栈实现

    项目场景: 二十四点问题本质是处理表达式,一提到处理表达式第一反应大概就是使用栈来处理,虽然网上大部分使用python语言处理二十四点问题都是利用强大的eval()函数,但我仍然想要使用python的 ...

  2. CSP CCF: 201903-2 二十四点 (C++)

    目录 题目来源 碎碎念 代码 题目来源 二十四点 碎碎念 加号.减号是同一层 乘法.除法是同一层 优先执行乘除 代码 #include <iostream> #include <fs ...

  3. 【CCF 201903-2】 二十四点(符号栈)

    写在前面 本题的常规做法是使用符号栈,特殊解法是使用Python的eval函数. 算法思想 将中缀表达式转化为后缀表达式,使用符号栈和数字栈. 当新的符号op入栈时,有两种情况: ① op的优先级 & ...

  4. 【CCF】201903-2 二十四点

    这道题我每次写都都会犯一些细节性的错误,然后最后调试的时候真的是怎么都找不出来!然后跟朋友说,让朋友帮忙找,结果朋友一眼看出来!所以,发现代码哪有有错的时候,当排除完你觉得会出错的地方以后,一定要再去 ...

  5. CCF CSP201903-2二十四点

    CCF CSP201903-2二十四点 题目描述 要点分析 此题是典型的中缀表达式的求解问题, 可以采用堆栈求解. 具体计算思路: 使用两个栈, num用于存储操作数, opt用于存储操作符 从左往右 ...

  6. C语言 解决CCF 二十四点问题

    利用 C 语言 解决 CCF题库中的二十四点问题 特别致谢:原博主程序 编译环境: IDE:DEV-C++ 语言:C语言 CCF CSP官方往年题库链接点我进入 1. 题目如下: 解题思路: 此题难点 ...

  7. 201903-2二十四点[20201213封笔题目]没写呢

    2020.12.13 csp今天就考试完了,我用了三天的时间,倒着刷完了所有的第一题,正着刷第二题,就到了这里.暂时结束吧. 哎,发现现在的考试越来越难了. 今天的考试连第二个体都过不了. 我死了. ...

  8. 「csp模拟试题 201903-2」二十四点 C/C++ 100分

    目录 题目 输入输出样例 题解思路 题解源码(c/c++) 题目 :二十四点 [问题描述] 定义每一个游戏由 4 个从 1-9 的数字和 3 个四则运算符组成,保证四则运算符将数字两两隔开,不存在括号 ...

  9. csp试题2:二十四点

    csp试题2:二十四点 题目 分析 代码 总结 题目 问题描述       二十四点是一款著名的纸牌游戏,其游戏的目标是使用3个加减乘除运算使得4张纸牌上数字的运算结果为24.       定义每一个 ...

最新文章

  1. PHP5.5.13 + Apache2.4.7安装配置流程详解
  2. Delphi2010使用TImage打开jpeg图片错误的处理
  3. JavaScript与DOM编程
  4. 苹果:2.7GHz G5比3.6GHz P4快98%(zz)
  5. 隐藏的iscroll元素显示后不能滚动问题
  6. 多线程爬虫191023
  7. Linux——vi编辑器
  8. php网页,想弹出对话框, 消息框 简单代码
  9. 为什么手机显示itunes store无法连接服务器,无法连接到itunes store是什么意思怎么办...
  10. 冒泡排序+查找打印——上海大学C语言考试
  11. CentOS/Ubuntu 下 MySQL 的安装
  12. 最大矩形面积(C++实现)
  13. c#程序设计语言杜松江版_C#程序设计语言复习题(试题及答案版)
  14. 空气污染扩散模型-高斯烟羽烟团模型原理及GIS应用示例
  15. 虚拟机 无法 ftp服务器系统,访问不到虚拟机上的ftp服务器上
  16. 网卡5790c linux驱动,富士通DPK5790H驱动
  17. 2019年复旦计算机专硕考研经验总结
  18. 卡方检验值转换为P值
  19. 深度强化学习中的对抗攻击和防御
  20. Google VP8 Code 首次深入技术分析 1

热门文章

  1. 微信分享链接不显示缩略图
  2. python的几种非线性回归
  3. 接入微信universal link微信校验不通过
  4. 解决--python+selenium获取页面一闪几秒就消失的元素内容
  5. 如何让网站变成黑白色或者灰色?
  6. Atom汉化之Atom-Simplified-Chinese-Menu
  7. 《计算之魂》思考题4.3
  8. android qq毛玻璃,腾讯电脑管家桌面整理重磅更新!支持毛玻璃效果!
  9. 身份证识别sdk在生活中的广泛应用
  10. linux如何初始化根文件系统,搭建自己的Linux根文件系统