CCF 201903-2 二十四点 用栈模拟简单计算器
二十四点
来源: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 二十四点 用栈模拟简单计算器相关推荐
- CCF-CSP 201903-2 二十四点 Python语言 模拟栈实现
项目场景: 二十四点问题本质是处理表达式,一提到处理表达式第一反应大概就是使用栈来处理,虽然网上大部分使用python语言处理二十四点问题都是利用强大的eval()函数,但我仍然想要使用python的 ...
- CSP CCF: 201903-2 二十四点 (C++)
目录 题目来源 碎碎念 代码 题目来源 二十四点 碎碎念 加号.减号是同一层 乘法.除法是同一层 优先执行乘除 代码 #include <iostream> #include <fs ...
- 【CCF 201903-2】 二十四点(符号栈)
写在前面 本题的常规做法是使用符号栈,特殊解法是使用Python的eval函数. 算法思想 将中缀表达式转化为后缀表达式,使用符号栈和数字栈. 当新的符号op入栈时,有两种情况: ① op的优先级 & ...
- 【CCF】201903-2 二十四点
这道题我每次写都都会犯一些细节性的错误,然后最后调试的时候真的是怎么都找不出来!然后跟朋友说,让朋友帮忙找,结果朋友一眼看出来!所以,发现代码哪有有错的时候,当排除完你觉得会出错的地方以后,一定要再去 ...
- CCF CSP201903-2二十四点
CCF CSP201903-2二十四点 题目描述 要点分析 此题是典型的中缀表达式的求解问题, 可以采用堆栈求解. 具体计算思路: 使用两个栈, num用于存储操作数, opt用于存储操作符 从左往右 ...
- C语言 解决CCF 二十四点问题
利用 C 语言 解决 CCF题库中的二十四点问题 特别致谢:原博主程序 编译环境: IDE:DEV-C++ 语言:C语言 CCF CSP官方往年题库链接点我进入 1. 题目如下: 解题思路: 此题难点 ...
- 201903-2二十四点[20201213封笔题目]没写呢
2020.12.13 csp今天就考试完了,我用了三天的时间,倒着刷完了所有的第一题,正着刷第二题,就到了这里.暂时结束吧. 哎,发现现在的考试越来越难了. 今天的考试连第二个体都过不了. 我死了. ...
- 「csp模拟试题 201903-2」二十四点 C/C++ 100分
目录 题目 输入输出样例 题解思路 题解源码(c/c++) 题目 :二十四点 [问题描述] 定义每一个游戏由 4 个从 1-9 的数字和 3 个四则运算符组成,保证四则运算符将数字两两隔开,不存在括号 ...
- csp试题2:二十四点
csp试题2:二十四点 题目 分析 代码 总结 题目 问题描述 二十四点是一款著名的纸牌游戏,其游戏的目标是使用3个加减乘除运算使得4张纸牌上数字的运算结果为24. 定义每一个 ...
最新文章
- PHP5.5.13 + Apache2.4.7安装配置流程详解
- Delphi2010使用TImage打开jpeg图片错误的处理
- JavaScript与DOM编程
- 苹果:2.7GHz G5比3.6GHz P4快98%(zz)
- 隐藏的iscroll元素显示后不能滚动问题
- 多线程爬虫191023
- Linux——vi编辑器
- php网页,想弹出对话框, 消息框 简单代码
- 为什么手机显示itunes store无法连接服务器,无法连接到itunes store是什么意思怎么办...
- 冒泡排序+查找打印——上海大学C语言考试
- CentOS/Ubuntu 下 MySQL 的安装
- 最大矩形面积(C++实现)
- c#程序设计语言杜松江版_C#程序设计语言复习题(试题及答案版)
- 空气污染扩散模型-高斯烟羽烟团模型原理及GIS应用示例
- 虚拟机 无法 ftp服务器系统,访问不到虚拟机上的ftp服务器上
- 网卡5790c linux驱动,富士通DPK5790H驱动
- 2019年复旦计算机专硕考研经验总结
- 卡方检验值转换为P值
- 深度强化学习中的对抗攻击和防御
- Google VP8 Code 首次深入技术分析 1