CCF201903-2二十四点
2024-09-07 11:05:48
思路描述:最开始的思路是拿一个栈来存储数据和符号,在动手实践的过程中发现行不通,单个数字的char和int转换可以,但是加起来的数据两位数字就很难处理了。
然后就去看了看别人的思路,给了我一个很好的启发就是把数据和符号分开存储,但是在处理减号时思路再次打乱,突然就想到了双端队列!
整理后的思路如下:(可能思路和我卡在同一个地方的更容易看明白我在说啥,尽量想让博客写的更容易理解些,会努力加油的!)
贴下代码:
#include<iostream>
#include<cstring>#include<deque> using namespace std; deque<int> num;//数据队列
deque<char> sign;//符号队列 int main() {
int n;
cin >> n;
char c[10]; for (int i = 0; i < n; i++) {
cin >> c;
//每次开始前先将队列清空
while (!num.empty())num.pop_back();
while (!sign.empty())sign.pop_back();
//遍历输入的数据
for (int j = 0; j < 7; j++) {
//数字压入数据队列
if (c[j] >= '0'&&c[j] <= '9') num.push_back(c[j] - '0');
else {
//对符号进行处理
//如果是+,先压入符号队列
if (c[j] == '+' || c[j]=='-') sign.push_back(c[j]);else if (c[j] == 'x') {
//运算后将运算结果压入队列中
int temp = num.back();
num.pop_back();
num.push_back(temp * (c[j + 1] - '0'));
j++;
}
else if (c[j] == '/') {
int temp = num.back();
num.pop_back();
num.push_back(temp / (c[j + 1] - '0'));
j++;
}
}
}
//处理队列中剩余元素(进行加法运算)
while (!sign.empty()) {
int temp1 = num.front();
num.pop_front();
int temp2 = num.front();
num.pop_front();
if (sign.front() == '+')num.push_front(temp1 + temp2);
else num.push_front(temp1 - temp2);
sign.pop_front();
}
//判断数据队列中剩余的最后一个元素
if (num.front() == 24) printf("%s\n", "Yes");
else printf("%s\n", "No");
} system("pause");
return 0;
}
最新文章
- 工作单元模式(UnitOfWork)学习总结
- 浅谈设计模式--建造器模式(Builder Pattern)
- [ASP.NET] 使用 ASP.NET SignalR 添加实时 Web
- 进入IT企业必读的200个.NET面试题
- Java三大主流开源工作流引擎技术分析
- 解决TableView / ScrollView上的Menu问题(1滑出View区域还可点击2导致点击menu后View不能滑动)
- myeclipse2014新感悟
- C/C++默认浮点型
- UWP 页面间传递参数(常见类型string、int以及自定义类型)
- Lintcode391 Number of Airplanes in the Sky solution 题解
- UNIX环境高级编程——信号
- win10 uwp 读取resw资源文件
- Android:android studio快捷键大全
- 【Django】关于设置和获取cookies
- 查看SQL语句的真实执行计划
- 一个整型数组里除了一个数字之外,其他的数字都出现了两次。要求时间复杂度是O(n),空间复杂度是O(1),如何找出数组中只出现一次的数字
- iOS 批量打包
- OpenCV中HSV颜色模型及颜色分量范围
- bat批处理(二):%0 %1——给批处理脚本传递参数
- IP共享重新验证