CSP-201903-2-二十四点

news2024/11/25 4:28:24

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.coloradmin.cn/o/1451687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TIM输出比较 P2

D触发器&#xff1f; 一、输出比较 二、PWM 1、简介 2、结构 三、外部设备 1.舵机 2.直流电机 我的理解是xO1 xIN1 & PWMx; xO2 xIN2 & PWMx;引入PWMx可以更方便的控制特定的电路。 四、函数学习 /*****单独设置输出比较极性*****/ void TIM_OC1PolarityConfig(…

CSS篇--transform

CSS篇–transform 使用transform属性实现元素的位移、旋转、缩放等效果 位移 // 语法 transform:translate(水平移动距离&#xff0c;垂直移动距离) translate() 如果只给一个值&#xff0c;表示x轴方法移动距离 单独设置某个方向的移动距离&#xff1a;translateX() transla…

Rust 基本环境安装

rust 基本介绍请看上一篇文章&#xff1a;rust 介绍 rustup 介绍 rustup 是 Rust 语言的安装器和版本管理工具。通过 rustup&#xff0c;可以轻松地安装 Rust 编译器&#xff08;rustc&#xff09;、标准库和文档。它也允许你切换不同的 Rust 版本或目标平台&#xff0c;以及…

Compose 自定义 - 数据转UI的三阶段(组合、布局、绘制)

一、概念 Compose 通过三个阶段把数据转化为UI&#xff1a;组合&#xff08;要显示什么&#xff09;、布局&#xff08;要显示在哪里&#xff09;、绘制&#xff08;如何渲染&#xff09;。 组合阶段 Compisition 界面首次渲染时会将可组合函数转化为一个个布局节点 Layout Nod…

【打工日常】使用docker部署linux-command解析搜索工具

一、linux-command介绍 linux-command工具是一个非盈利性的工具&#xff0c;里面记录了550 个 Linux 命令&#xff0c;内容包含 Linux 命令手册、详解、学习&#xff0c;是值得收藏的 Linux 命令速查手册。内容来自网络和网友的补充。 二、本次实践介绍 1. 本次实践简介 本次…

Flume(二)【Flume 进阶使用】

前言 学数仓的时候发现 flume 落了一点&#xff0c;赶紧补齐。 1、Flume 事务 Source 在往 Channel 发送数据之前会开启一个 Put 事务&#xff1a; doPut&#xff1a;将批量数据写入临时缓冲区 putList&#xff08;当 source 中的数据达到 batchsize 或者 超过特定的时间就会…

qt-C++笔记之捕获鼠标滚轮事件并输出滚轮角度增量

qt-C笔记之捕获鼠标滚轮事件并输出滚轮角度增量 code review! 文章目录 qt-C笔记之捕获鼠标滚轮事件并输出滚轮角度增量1.运行2.main.cpp3.main.pro 1.运行 2.main.cpp #include <QApplication> #include <QWidget> #include <QWheelEvent> #include <…

.NET Core MongoDB数据仓储和工作单元模式封装

前言 上一章我们把系统所需要的MongoDB集合设计好了&#xff0c;这一章我们的主要任务是使用.NET Core应用程序连接MongoDB并且封装MongoDB数据仓储和工作单元模式&#xff0c;因为本章内容涵盖的有点多关于仓储和工作单元的使用就放到下一章节中讲解了。仓储模式&#xff08;R…

java的面向对象编程(oop)——认识枚举

前言 打好基础&#xff0c;daydayup! 枚举 1&#xff0c;认识枚举&#xff1a; 枚举是一种特殊类&#xff0c;用enum语句修饰。与普通类不同的是&#xff1a;枚举类的第一行只能写一些合法的标识符&#xff08;名称&#xff09;&#xff0c;多个名称用逗号隔开。这些标识符&a…

相机图像质量研究(16)常见问题总结:光学结构对成像的影响--IRCUT

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

原型模式-Prototype Pattern

原文地址:https://jaune162.blog/design-pattern/prototype-pattern/ 引言 在Java中如果我们想要拷贝一个对象应该怎么做?第一种方法是使用 getter和setter方法一个字段一个字段设置。或者使用 BeanUtils.copyProperties() 方法。这种方式不仅能实现相同类型之间对象的拷贝,…

第三百四十九回

文章目录 1. 概念介绍2. 原理与方法2.1 知识对比2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"加密包crypto"相关的内容&#xff0c;本章回中将介绍characters包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 在项目中会遇到获取字…

解决vscode报错,在赋值前使用了变量“XXX“

问题&#xff1a;如图所示 解决方法&#xff1a; 法一&#xff1a; 补全函数使其完整 法二&#xff1a; 使用断言

Python算法探索:从经典到现代

目录 引言 一、经典算法&#xff1a;快速排序 示例代码&#xff1a; 二、经典算法&#xff1a;二分查找 示例代码&#xff1a; 三、现代算法&#xff1a;支持向量机&#xff08;SVM&#xff09; 示例代码&#xff1a; 四、现代算法&#xff1a;神经网络 示例代码&…

从汇编分析C语言可变参数的原理,并实现一个简单的sprintf函数

C语言可变参数 使用printf等函数的时候函数原型是printf(const char* fmt, ...), 这一类参数的个数不限的函数是可变参数 使用 使用一个头文件stdarg.h, 主要使用以下的宏 typedef char * va_list;// 把 n 圆整到 sizeof(int) 的倍数 #define _INTSIZEOF(n) ( (sizeo…

STM32 USART串口通信

目录 USART串口 串口发送 串口发送接收 串口收发HEX数据包 串口收发文本数据包 USART串口 串口发送 Serial.c #include "stm32f10x.h" // Device header #include "stdio.h" #include "stdarg.h"/*** brief 初始化串口以…

leetcode:96.不同的二叉搜索树

解题思路&#xff1a; 输入n3 n 0 1个 n 1 1个 n 2 2个 头1头2头3 头1 左子树0节点&#xff08;个数&#xff09;x右子树2个节点&#xff08;个数&#xff09; 头2 左子树1节点&#xff08;个数&#xff09;x右子树1个节点&#xff08;个数&#xff09; 头3 左子…

Android 13.0 SystemUI下拉状态栏定制二 锁屏页面横竖屏解锁图标置顶显示功能实现

1.前言 在13.0的系统rom定制化开发中,在关于systemui的锁屏页面功能定制中,由于在平板横屏锁屏功能中,时钟显示的很大,并且是在左旁边居中显示的, 由于需要和竖屏显示一样,所以就需要用到小时钟显示,然后同样需要居中,所以就来分析下相关的源码,来实现具体的功能 如图…

租赁香港服务器多少钱一个月?24元

阿里云香港服务器2核1G、30M带宽、40GB ESSD系统盘优惠价格24元/月&#xff0c;288元一年&#xff0c;每月流量1024GB&#xff0c;多配置可选&#xff0c;官方优惠活动入口 https://t.aliyun.com/U/bLynLC 阿里云服务器网aliyunfuwuqi.com分享阿里云香港服务器优惠活动、详细配…

VMware Workstation 17.0 虚拟机的安装、配置、创建运行DOS、Windows、Linux和VMware ESX(详细图文搭建系统教程)

VMware Workstation 17.0 虚拟机的安装、配置、创建运行DOS、Windows、Linux和VMware ESX&#xff08;图文教程&#xff09; 一、VMware Workstation是什么&#xff1f;1.1 VMware Workstation 17.0简介1.2 VMware Workstation 17.0新特性1.3 VMware Workstation 17.0下载地址1…