题目描述

这道题目的主要解题思想是用堆栈来解决四则运算的优先级问题。


本题的关键点在于如何正确处理运算符的优先级问题,可以使用两个栈来解决这个问题。一个是运算数栈,另一个是运算符栈。

在遍历当前算术表达式字符串时会有五种情况:

  1. 当前字符是数字。
    如果当前字符是数字的话,那么就直接将其转换成对应的整型数并压入运算数栈中。
  2. 当前字符是加号
    由于加法的优先级低于乘法和除法,所以不能直接进行加法运算,要先把加号压入运算符栈中。
  3. 当前字符是减号
    减法的优先级同加法一样,也不能直接进行运算。此处为了后续操作方便,统一将a-b的形式转换成a+(-b)的形式来运算减法。即将加号压入运算符栈中,将第二个运算数取反之后压入运算数栈中。
  4. 当前字符是乘号
    乘法在本题中是优先级最高的,可以直接进行运算。去运算数栈的栈顶元素和乘号后面的那个运算数做乘法,将结果再压入运算数栈中。
  5. 当前字符是除号
    除法的优先级同乘法一样,操作同上。

在遍历完算术表达式时,说明式子中的乘除运算都已经完成,下面只剩下加法(减法已经转换成加法),直到运算符栈为空,最终的结果就是运算数的栈顶元素。最后拿这个数和24来进行比对即可。

#include <iostream>
#include <string>
#include <string.h>
#include <stack>using namespace std;//二十四点游戏 ,特别注意运算符的优先级问题!!!用堆栈来解决
int main() {int n; //表达式的个数 string str; //暂存当前表达式 int i, j;int result[100] = {0}; //1代表计算结果是24, 0代表不是 stack<int> num; //运算数栈 stack<char> op; //运算符栈 cin >> n;for (i = 0; i < n; i++) {cin >> str;for (j = 0; j < str.length(); j++) {if (isdigit(str[j])) { //是数字 num.push(str[j] - '0');} else if (str[j] == '+') {op.push('+');} else if (str[j] == '-') { //将减法转换成加法 op.push('+');num.push(-(str[j + 1] - '0'));j++;} else if (str[j] == 'x') { //直接计算乘法 int num1 = num.top();num.pop();num.push(num1 * (str[j + 1] - '0'));j++;} else if (str[j] == '/') { //直接计算除法 int num1 = num.top();num.pop();num.push(num1 / (str[j + 1] - '0'));j++;}}while (!op.empty()) {int num1 = num.top();num.pop();int num2 = num.top();num.pop();num.push(num1 + num2);op.pop();}if (num.top() == 24) {result[i] = 1;}num.pop(); //清空操作数栈   }for (i = 0; i < n; i++) {if (result[i] == 0) {cout << "No" << endl;} else {cout << "Yes" << endl;}}return 0;
}

CCF试题 201903-2 二十四点相关推荐

  1. csp试题2:二十四点

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

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

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

  3. CCF认证考试201903-2二十四点

    试题 思路 暴力求解,对运算符挨个进行判断.先乘除后加减. 代码 import mathdef subCal(strCal,num_left,num_right):num_left = int(num ...

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

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

  5. CCF CSP201903-2二十四点

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

  6. CCF 201903-2 二十四点 用栈模拟简单计算器

    二十四点 来源:CCF 背景 二十四点是一款著名的纸牌游戏,其游戏的目标是使用 3 个加减乘除运算使得 4张纸牌上数字的运算结果为 24. 题目 定义每一个游戏由 4 个从 1-9 的数字和 3 个四 ...

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

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

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

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

  9. CCF-CSP 201903-2 二十四点(python实现)

    题源来自---CCF计算机职业资格认证官网,点击报名入口,可进行模拟考试进行练习.代码在最后. 代码 应用eval函数 eval:将传入的字符串当成有效的表达式来求值并返回计算结果. n=int(in ...

  10. 从LeetCode 679. 24 Game--C++ 解法--二十四点 到穷举24点所有可能性-24点大全

    从LeetCode 679. 24 Game–C++ 解法–二十四点 到穷举24点所有可能性 此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题 ...

最新文章

  1. SetRegistryKey函数
  2. 阿里云容器服务全面升级为 ACK Anywhere,让云的边界拓展至企业需要的每个场景
  3. 参加JavaEE培训需要什么条件
  4. [Everyday Mathematics]20150214
  5. c++ template笔记(3)非类型模板参数nontype template parameters
  6. 基于IP的H.264关键技术
  7. 第十八节:教你如何使用ES6的Promise对象
  8. Springboot2集成minidao持久层
  9. 帝国CMS7.2仿极客网互联网自媒体门户模板
  10. 步步为营 .NET 代码重构学习笔记 十
  11. java 构造块_java中构造方法、普通块、静态代码块、构造块的执行顺序
  12. xml、xhtml、html、dhtml的区别
  13. Bus hound USTS
  14. .net 和 j2ee的区别
  15. 太阳能发电板的规格尺寸_太阳能电池板瓦数和尺寸如何计算?
  16. scrapy 爬取煎蛋网图片
  17. Ubuntu 耳机和音响没有声音
  18. 关于微信小程序授权登陆之后需要在个人信息页展示信息,如微信头像,昵称这件事
  19. Windows2008环境64位操作系统如何安装32位BDE
  20. 金蝶服务端调用OSF服务

热门文章

  1. 小米扫地机器人一直提示安装尘盒_小米扫地机器人怎么清理尘盒滤网?
  2. python爬虫淘宝比价
  3. 淘宝详情页设计要点有哪些 优秀淘宝详情页面多少屏合适
  4. win10查看网卡的vender ID和device ID
  5. Python—网络编程_Mail
  6. Normalized Gini Coefficient
  7. 经常眩晕,可能是不痛的偏头痛
  8. Python中参数前面的星号
  9. 360如何查看计算机配置文件,win7中怎么查看路由器配置文件config.bin
  10. 腾讯art-template4,即vue后又获一利器