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;
}

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/472278.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Taro开发鸿蒙原生应用——快速上手,鸿蒙应用开发指南

导读 本指南为开发者提供了使用 Taro 框架开发鸿蒙原生应用的快速入门方法。Taro&#xff0c;作为一个多端统一开发框架&#xff0c;让开发者能够使用一套代码同时适配多个平台&#xff0c;包括鸿蒙系统。文章将详细介绍如何配置开发环境&#xff0c;以及如何利用 Taro 的特性…

紫微斗数双星组合:天机天梁在辰戌

文章目录 前言内容总结 前言 紫微斗数双星组合&#xff1a;天机天梁在辰戌 内容 紫微斗数双星组合&#xff1a;天机天梁在辰戌 性格分析 在紫微斗数命盘中&#xff0c;天梁星是一颗“荫星”&#xff0c;能够遇难呈祥&#xff0c;化解凶危&#xff0c;主寿&#xff0c;主贵。…

私立医院患者大数据分析平台建设方案

一、项目目标 1、数据质量,统计数字不仅是真实可信,而且要及时,便于及时判断企业经营情况,同时通过内外部数据的对标,发现企业经营问题。 2、提供指标的监控预警,为决策提供支持,减少杂乱无用报表的生产。 3、提升数据处理效率,提高报表的可用性,让数据标准化,提高…

【旧文更新】【优秀毕设】人脸识别打卡/签到/考勤管理系统(OpenCV+最简基本库开发、可移植树莓派 扩展网络图像推流控制 验证码及Excel邮件发送等功能)

【旧文更新】【优秀毕设】人脸识别打卡/签到/考勤管理系统&#xff08;OpenCV最简基本库开发、可移植树莓派 扩展网络图像推流控制 验证码及Excel邮件发送等功能&#xff09; 文章目录 关于旧文新发毕设结构主页面验证码识别效果管理页面人脸信息采集管理实时数据更新签到结果…

DSA 经典数据结构与算法 学习心得和知识总结(三) |有向无环图及其应用

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《算法导论》第三版 就是这本被封神的杰作&#xff0c;就是它&#x1f926; 2、参考书籍&#xff1a;《数据结构》严奶奶版 3、参考书…

论文解读:在神经网络中提取知识(知识蒸馏)

摘要 提高几乎所有机器学习算法性能的一种非常简单的方法是在相同的数据上训练许多不同的模型&#xff0c;然后对它们的预测进行平均[3]。不幸的是&#xff0c;使用整个模型集合进行预测是很麻烦的&#xff0c;并且可能在计算上过于昂贵&#xff0c;无法部署到大量用户&#x…

【从Python基础到深度学习】 8. VIM两种状态

一、安装 sudo apt install vim 二、VIM两种模式 - 命令状态/编辑状态 1.1 进入/退出VIM 进入VIM vim 退出vim :q <enter> 2.2 根目录下添加配置文件 window下创建vimrc类型文件内容如下&#xff1a; set nu set cursorline set hlsearch set tabstop4 使用Wins…

CSS3学习(二)

目录&#xff1a; 1. 字体属性 1.1 字体系列 1.2 字体大小 1.3 字体粗细 1.4 文字样式 1.5 字体复合属性 1.6 总结 2 文本属性 2.1 文本颜色 2.2 对齐文本 2.3 装饰文本 2.4 文本缩进 2.5 行间距 2.6 总结 1. 字体属性 1.1 字体系列 使用font-family属性定义文…

云计算基础-虚拟机迁移原理

什么是虚拟机迁移 虚拟机迁移是指将正在运行的虚拟机实例从一个物理服务器&#xff08;或主机&#xff09;迁移到另一个物理服务器&#xff08;或主机&#xff09;的过程&#xff0c;而不会中断虚拟机的运行。 虚拟机拟机迁移分类虚 热迁移&#xff1a;开机状态下迁移 冷迁…

JVM-JVM中对象的生命周期

申明&#xff1a;文章内容是本人学习极客时间课程所写&#xff0c;文字和图片基本来源于课程资料&#xff0c;在某些地方会插入一点自己的理解&#xff0c;未用于商业用途&#xff0c;侵删。 原资料地址&#xff1a;课程资料 对象的创建 常量池检查:检查new指令是否能在常量池…

LeetCode--代码详解 3.无重复字符的最长子串

3.无重复字符的最长子串 题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bb…

linux系统zabbix监控分布式监控的部署

分布式监控 服务器安装分布式监控安装工具安装mysql导入数据结构配置proxy端浏览器配置 zabbix server端监控到大量zabbix agent端&#xff0c;这样会使zabbix server端压力过大&#xff0c;使用zabbix proxy进行分布式监控 服务器安装分布式监控 安装工具 rpm -Uvh https://…