CSP-201903-2-二十四点

2024-02-17 10:36
文章标签 csp 二十四点 201903

本文主要是介绍CSP-201903-2-二十四点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CSP-201903-2-二十四点

一、中缀表达式转后缀表达式

中缀表达式是一种常见的数学表达式书写方式,其中操作符位于相关的操作数之间,如 A + B。而后缀表达式(逆波兰表示法)则是一种没有括号,操作符跟随操作数之后的表示方法,例如相同的表达式在后缀表示法中写作 A B +

转换过程通常使用一个栈来临时存储操作符,以保持操作符的正确顺序和处理优先级。以下是转换步骤:

  1. 创建一个空栈用于存放操作符,创建一个空列表用于输出后缀表达式。
  2. 从左到右扫描中缀表达式
    • 如果遇到操作数,则直接将其加到输出列表。
    • 如果遇到左括号 (,则将其压入栈中。
    • 如果遇到右括号 ),则从栈中弹出操作符并加到输出列表,直到遇到左括号为止(左括号弹出栈但不加到输出列表)。
    • 如果遇到操作符,则:
      • 从栈中弹出所有优先级大于或等于当前操作符的操作符,并将它们加到输出列表。
      • 然后将当前操作符压入栈中。
  3. 扫描完毕后,将栈中剩余的操作符依次弹出并加到输出列表的末尾。
  4. 最终,输出列表就是转换得到的后缀表达式。

二、计算后缀表达式的结果

计算后缀表达式(逆波兰表示法)的结果也需要使用一个栈。以下是计算步骤:

  1. 创建一个空栈用于存放操作数。
  2. 从左到右扫描后缀表达式
    • 如果遇到操作数,则将其压入栈中。
    • 如果遇到操作符,则从栈中弹出顶部的两个操作数(注意弹出的顺序),对它们应用操作符进行计算,然后将结果压回栈中。
  3. 重复上述过程,直到后缀表达式的末端。
  4. 表达式结束时,栈顶的元素即为整个表达式的计算结果。

三、举例

例子1:

中缀表达式: 3 + 4 * 2 / ( 1 - 5 )

后缀表达式: 3 4 2 * 1 5 - / +

例子2:

中缀表达式: (( 7 + 3 ) * ( 5 - 2 )) / ( 8 - 4 )

后缀表达式: 7 3 + 5 2 - * 8 4 - /

例子3:

中缀表达式: 8 + 3 * 4 / 2

后缀表达式: 8 3 4 * 2 / +

四、代码

#include <iostream>
#include <stack>
#include <string>
#include <vector>
#include <sstream>
#include <cctype>using namespace std;// 检查是否为操作符
bool isOperator(char c) {return c == '+' || c == '-' || c == 'x' || c == '/';
}// 比较操作符优先级
int precedence(char op) {if (op == '+' || op == '-') return 1;if (op == 'x' || op == '/') return 2;return 0;
}// 中缀表达式转后缀表达式
string infixToPostfix(const string& infix) {stack<char> opStack;string postfix;for (char c : infix) {if (isdigit(c)) {postfix += c;}else if (c == '(') {opStack.push(c);}else if (c == ')') {while (!opStack.empty() && opStack.top() != '(') {postfix += opStack.top();opStack.pop();}opStack.pop(); // 弹出 '('}else if (isOperator(c)) {while (!opStack.empty() && precedence(opStack.top()) >= precedence(c)) {postfix += opStack.top();opStack.pop();}opStack.push(c);}}while (!opStack.empty()) {postfix += opStack.top();opStack.pop();}return postfix;
}// 计算后缀表达式
int evaluatePostfix(const string& postfix) {stack<int> valStack;for (char c : postfix) {if (isdigit(c)) {valStack.push(c - '0');}else {int val2 = valStack.top(); valStack.pop();int val1 = valStack.top(); valStack.pop();switch (c) {case '+': valStack.push(val1 + val2); break;case '-': valStack.push(val1 - val2); break;case 'x': valStack.push(val1 * val2); break;case '/': valStack.push(val1 / val2); break;}}}return valStack.top();
}int main()
{int n;cin >> n;for (int i = 0; i < n; i++){string infix;cin >> infix;string postfix = infixToPostfix(infix);int result = evaluatePostfix(postfix);if (result == 24){cout << "Yes\n";}else{cout << "No\n";}}return 0;
}

请添加图片描述

这篇关于CSP-201903-2-二十四点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/717504

相关文章

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

CSP-J基础之数学基础 初等数论 一篇搞懂(二)

文章目录 前言算术基本定理简介什么是质数?举个简单例子:重要的结论:算术基本定理公式解释:举例: 算术基本定理的求法如何找出质因数:举个简单的例子: 重要的步骤:C++实现 同余举个例子:同余的性质简介1. 同余的自反性2. 同余的对称性3. 同余的传递性4. 同余的加法性质5. 同余的乘法性质 推论 总结 前言 在计算机科学和数学中,初等数论是一个重要的基础领域,涉及到整数

CSP-J基础之cmath常见函数

文章目录 前言1. **`sin` 函数**2. **`cos` 函数**3. **`exp` 函数**4. **`log` 函数**5. **`fabs` 函数**6. **`pow` 函数**7. **`sqrt` 函数**8. **`ceil` 函数**9. **`floor` 函数** 总结 前言 在计算机科学与编程中,数学函数是解决各种计算问题的基础工具。C++标准

CSP-J选择题 - 排列组合

排列问题:有5名学生参加比赛,要求排成一排拍照,有多少种不同的排列方式?组合问题:从10本书中选出3本书送给朋友,有多少种不同的选择方式?排列问题:一个教室有7个座位,5个学生需要坐下,有多少种不同的排列方式?组合问题:从12个人中选出4个人组成一个团队,有多少种不同的方式?排列问题:一个密码由4个字母组成,字母可以重复使用,有多少种不同的排列组合?组合问题:从8个不同颜色的球中选出3个,不考虑顺

CSP-J 之C++常用英文缩写

文章目录 C++常用英文缩写前言常用缩写解析C++ 基础缩写输入输出相关控制台 命名与类型常用函数在线测评相关 总结 C++常用英文缩写 前言 在编程比赛和日常开发中,C++是一门广泛使用的编程语言,许多英文缩写贯穿其中。了解这些缩写不仅有助于提高编程效率,还能加深对编程语言及其工作机制的理解。本文将介绍C++中常见的英文缩写,以及它们在编程中的实际含义和应用。 常用

P7072 [CSP-J2020] 直播获奖

题目描述     NOI2130即将举行。为了增加观赏性,CCF决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为w% 的选手的最低成绩就是即时的分数线。     更具体地,若当前已评出了 p 个选手的成绩,则当前计划获奖人数为max(1,⌊p∗w%⌋),其中w是获奖百分比,⌊x⌋ 表示对x向下取整,max(x,y) 表示x和y中较大的数。如有选手成绩相同,则所有成绩并列的

CSP-J/S 复赛程序提交指南,提交错误必爆零!!!

CSP-J/S 复赛题目程序需要以文件的形式提交,如果之前没有了解过,那肯定会爆0,该怎么操作呢? 大家好,我是大李。 针对复赛考试提交详情,这里做个详细介绍,分为文件的创建和文件体提交等事项。 一、关于文件建立 复赛考试时需要根据提示,在桌面建立文件夹,将含有文件体的cpp文件保存至桌面。 每一题的命名都需要根据提示来去命名。 以2023年CSP-J/S 第二轮为例 在电

CSP初赛知识点讲解(十二)

图 简单来说:用边把一些点连接起来叫图 有向图:边有方向的图,比如边a–>b,只能由a到b,不 能由b到a。 无向图:边没有方向的图,连接点a和b,那么a和b可以相互到达。 结点的度:无向图中与结点相连的边的数目。 结点的入度:在有向图中,以这个结点为终点的有向边 的数目。 结点的出度:在有向图中,以这个结点为起点的有向边 的数目。 联通图:图中任意两点能互相到达的图。 完全图:一

AI - CSP

Variable OrderingValue OrderingBackwardForwardAC3 Question 1 Crossword Puzzle Variable Ordering Value Ordering Backward Forward AC3 Question 1: Crossword Puzzle Stanford CS227 Assig