CSP练习2:201903-2 二十四点

【csp201903-2】二十四点 一开始看到要将一个式子翻译出来并计算的时候我有想到数据结构课上讲的后缀表示法和前缀表示法,里面很重要一点就是栈,但我们为什么要用栈呢。因为后缀表示法是按规则将数字和符号拆开了(相对而言),我们需要恢复这个规则。后续大概会复习一下数据结构。先拆开式子,符号是符号,数字是数字,然后先算乘除,最后再做加减。其中前两步我融为了一步。想通这个问题之后,我们回到问题本身,后缀表示法是不是也是先乘再加?我们用数组模仿这个。 阅读详情

 这个题可以普通的用数组进行求解,也可以像本文一样采取中缀转后缀的方式,然后再进行计算

主要注意的地方是:题目中的乘法用的是字母x,因为这个原因改了一个晚上代码,不知道这样设置为什么。

主要代码如下:

#include <iostream>
#include <stack>
using namespace std;
int transform(char a) 
{
	if (a == '0') return 0;
	if (a == '1') return 1;
	if (a == '2') return 2;
	if (a == '3') return 3;
	if (a == '4') return 4;
	if (a == '5') return 5;
	if (a == '6') return 6;
	if (a == '7') return 7;
	if (a == '8') return 8;
	if (a == '9') return 9;
}
int main(void) 
{
	int n;
	cin >> n;
	int result[100];//用来存放结果,1表示yes,0表示no
	stack<char>ch;
	char a[100][7];
	char r[7];
	for (int i = 0; i < n; i++) 
	{
		//cout << "****************************第" << i << "次大循环进行输入" << endl;
		//每一个进行一次处理
		int f = 0;
		cin >> a[i];
		for (int j = 0; j < 7; j++)
		{
			//cout << "进入第" << j << "次循环" << endl;
			//cout << "处理" << a[i][j] << " " << endl;
			if (a[i][j] == '+' || a[i][j] == '-')
			{
			//	cout << "匹配上+ /-" << endl;
				if (ch.empty()) { ch.push(a[i][j]); }
				else {
					while (!ch.empty() && (ch.top() == '+' || ch.top() == '-' || ch.top() == '*' || ch.top() == '/'||ch.top()=='x'))
					{
						//cout << "检测到一个比加好等级小的" << endl;
						r[f] = ch.top();
						ch.pop();
						f++;
					}
					ch.push(a[i][j]);
				}
			}
			else if (a[i][j] == '*' || a[i][j] == '/'||a[i][j] == 'x')
			{
				//cout << "打印栈顶"<<ch.top()<<endl;
				while (!ch.empty() && ( ch.top() == '*' || ch.top() == '/' || ch.top() == 'x'))
				{
				//	cout << "检测到一个同级的" << endl;
					r[f] = ch.top();
					ch.pop();
					f++;
				}
				ch.push(a[i][j]);
			}
			else
			{
				r[f] = a[i][j];
				f++;
			}
		}
		//cout << "输出第一次的f  " << f << endl;
			while (!ch.empty()) 
			{
			//	cout << "不为空" << ch.top() << endl;
				r[f] = ch.top();
				ch.pop();
				f++;
			}
			//cout <<"长度为"<< f<<endl;
			/*for (int y = 0; y <= f; y++) 
			{
				cout << r[y] << endl;
			}*/
			int jie;//用来存储当前次的结果
			stack<int>w;
			for (int p = 0; p < f; p++) 
			{
				if (r[p] == '+') 
				{
				//	cout << "做加法" << endl;
					int a = w.top();
					w.pop();
					int b = w.top();
					w.pop();
					jie = b + a;
					w.push(jie);
				//	cout << jie << "中间结果" << endl;

				}
				else if (r[p] == '-') 
				{
				//	cout << "做减法" << endl;
					int a = w.top();
					w.pop();
					int b = w.top();
					w.pop();
					jie = b - a;
					w.push(jie);
				}
				else if (r[p] == '*'||r[p]=='x')
				{
				//	cout << "做乘法" << endl;
					int a = w.top();
				//	cout << "第一个乘数" << a << endl;
					w.pop();
					int b = w.top();
				//	cout << "第2个乘数" << b << endl;
					w.pop();
					jie = b * a;
				//	cout << "这时结果为" << jie << endl;
					w.push(jie);
				}
				else if (r[p] == '/')
				{
					int a = w.top();
					w.pop();
					int b = w.top();
					w.pop();
					jie = b / a;
					w.push(jie);
				}
				else 
				{
					int aa = transform(r[p]);
					w.push(aa);
				}
			//	cout <<"++++++"<< w.top();
			}
			jie = w.top();
			//cout << "输出结果" << jie << endl;
			if (jie == 24) 
			{
				result[i] = 1;
			}
			else {
				result[i] = 0;
			}

		

	}
	for (int m = 0; m < n; m++) 
	{
		if (result[m] == 1)
			cout << "Yes" << endl;
		else if (result[m] == 0)
			cout << "No" << endl;
	}
	system("pause");
	return 0;
}




运行结果为:

 

CSP认证201903-2 二十四点 CSP认证201903-2 二十四点 可以看到,这个问题就是简单的表达式求值,而且只有4个数,没有括号,可以用栈很简单的解决 步骤说明: 使用两个栈,一个保存操作数,一个保存运算符。 扫描表达式字符串,如果是数字,则将数字入栈。 如果是运算符,则需要看优先级;如果这是第一个运算符或者这个运算符的优先级比栈顶的运算符的优先级更高,则将这个运算符入栈。 如果扫描到一个运算符A,运算符A... 阅读详情

相关推荐

CCF CSP201903-2二十四点(C++100)

CCF CSP201903-2二十四点 栈模拟 #include<iostream> #include<stack> #include<string> #include<map> using namespace std; stack<int>number; stack<char>sign; map<char,int>mp; int deal(int num1, int num2, char c){ if(c == 'x'

qq_44091681的博客 422

CSP-201903-2-二十四点

CSP-201903-2-二十四点

fzy2003的博客 409

CSP - 201903-2 - 二十四点 (C++)

解题思路 由于输入格式固定,所以比较好计算。 首先创建一个操作数栈和一个运算符栈,读入的字符分别进栈,当运算符栈读入的为+号时不动,读入减号时将后一个操作数转换为负数(-1*x),读入乘除时出栈两个操作数进行运算,将结果入栈,最后将剩余的运算符进行加法操作。 注意 几个注意点: 除法时需要注意除数与被除数的顺序。 减号转换为加负数是因为:如果有一个表达式为 a-b*c-d 时c-d的-号视为...

C橘子 3760

CCF-CSP认证在哪里练习

记录一下两个网站,都是官网,好像一个是新的一个是旧的。新的这个可以模拟考试,但有提交次数限制。旧的这个是一个个的题目,旧的网站好像没有放最新一期的题目。反正看个人需求吧。

chengor的博客 5511

CCF201903-2 二十四点

二十四点 背景 二十四点是一款著名的纸牌游戏,其游戏的目标是使用 3 个加减乘除运算使得 4张纸牌上数字的运算结果为 24。 题目 定义每一个游戏由 4 个从 1-9 的数字和 3 个四则运算符组成,保证四则运算符将数字两两隔开,不存在括号和其他字符,运算顺序按照四则运算顺序进行。其中加法用符号 + 表示,减法用符号 - 表示,乘法用小写字母 x 表示,除法用符号 / 表示。在游戏里除法为整除...

qq_41982147的博客 833

JDK8升级JDK17过程中遇到的那些坑

JDK8虽然非常好,但是JDK版本已经发布到JDK20了,且JDK8后的版本升级了很多新的特性,如模块化、ZGC以及虚拟线程、结构性并发等,也是非常有吸引力的,所以决定将基于JDK8的项目升级到最近的LTS版本JDK17。

BASK2312的博客 6685

csp 二十四点

#include<bits/stdc++.h> using namespace std; int priority(char c) { if (c == '#') return 0; else if (c == '$') return 1; else if (c == '+' || c == '-') return 2; else return 3; } int calculate(int x, int y, char c) { if (c == '+') { return

<WRM>的博客 374

Win10或Win8下ObjectARX2015 Wizard向导创建项目失败解决方法

[原创]objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法总结 by edata @2017-5-1 objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法 因为Win8/Win10对系统盘(默认c:)使用了高级权限管理,所以在此盘下操作文件的修改工作都需要管理员权限才行。 基于这个原因,导致非管理员安

edata的博客 7029

csp 模板生成系统(含解析)

思路 这道题,提交了四次,四次运行超时,不知道怎么回事,看了别人的题解才知道自己想多了… 评测用例规模及约定 输入保证模板中所有以 {{ 开始的子串都是合法的标记,开始是两个左大括号和一个空格,然后是变量名,结尾是一个空格和两个右大括号。 1.变量不用你判断是否合法! 2.以 {{ 开始,结尾是一个空格和两个右大括号,所以不用担心左右括号谁前谁后,也不用担心连续多个左/右括号! 然而…我觉得我应该回去重修语文… 思路 把模板一行一行存入vector 把要替换的变量名和值存入map,值要去除双引号 然后一

weixin_44915226的博客 670

SDM量化噪声等效到PLL输出的传递函数推导

在历年文章或书本中少见SDM量化噪声等效到PLL输出的传递函数推导。需了解SDM量化噪声的本质,配合欧拉方程简化,并将Z域转化成S域。最终结合断环处等效到PLL输出的传递函数,方可完成。

u010486560的博客 1407

UniApp实战:从文件下载到本地保存与预览的一站式解决方案

本文深入解析了UniApp开发中文件下载、保存与预览的完整流程,提供了基于uni.downloadFile、uni.saveFile和uni.openDocument API的一站式实战解决方案。文章详细拆解了核心API的使用方法、多平台(App、H5)的兼容性处理、常见坑点(如文件路径、权限、格式支持)以及进阶优化技巧(如进度提示、文件管理),旨在帮助开发者构建健壮、用户体验良好的跨平台文件处理功能。

d3e4f的博客 614

ccf csp 201903-2 二十四点

#include<iostream> using namespace std; bool isMD(char op){ return (op == '/' || op == 'x' ? true : false); } int op(char op, int num1, int num2){ switch (op) { case '+': ...

lalala_HFUT的博客 5805

解决windows10下无法安装.net framework 3.5(包括.net2.0和3.0)

入域电脑,win10系统中安装 .net framework 3.5(包括.net2.0和3.0)

God_me_1的博客 4万+

CSP:二十四点

试题编号:201903-2 试题名称:二十四点 时间限制:1.0s 内存限制:512.0MB 思路:加减乘除四则运算问题,经典的思路是使用栈模拟:两个栈,一个是数字栈,另一个是符号栈。这里题目要求简单,简单用栈处理即可。 #include<iostream> #include<cstring> #include<cstdio> #include&...

cax1165 3654

Python 爬虫实战:从零搭建第一个爬虫程序(附完整代码)

本文介绍了Python网络爬虫的入门实战,以豆瓣Top250电影榜单为例,详细讲解爬虫开发全流程。内容包括爬虫基础原理、环境搭建、请求发送与响应处理、数据解析与保存等核心环节,并提供了可直接运行的完整代码示例。文章还分析了常见问题解决方案,并强调了爬虫开发的合规注意事项。通过本教程,读者可快速掌握Python爬虫的基本思路和实操技巧,为后续深入学习BeautifulSoup、XPath等进阶技术打下基础。

2503_91057718的博客 2316

在STM32F103RBT6微控制器上利用USB虚拟Com端口技术,高效实现ADC数据传输:详细操作步骤与示例代码解析

以上就是在STM32F103RBT6上使用USB虚拟Com端口实现ADC数据传输的全部内容。虽然过程中有很多步骤和细节需要注意,但只要按照步骤来,理解每一段代码的作用,就完全可以掌握这个过程。在实际应用中,我们可能需要根据实际需要修改一些代码,如调整ADC的参数,改变数据的处理方式等。但是,只要理解了这个过程,我们就可以很灵活地进行修改。希望这篇文章对你有所帮助。如果你有任何疑问,欢迎在评论区留言,我会尽我所能进行解答。

qq_38334677的博客 1168

CCF CSP 201903 02 二十四点游戏

CCF CSP 201903 02 二十四点游戏 试题编号: 201903-2 试题名称: 二十四点 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 我的思路是 遇到加减法(减法的减数处理成负数最后只做加法 不然回wr)压栈 遇到乘除法 计算 完成之后 把 栈排空 问题找到了 减法没有做特殊处理...

qq_28640193的博客 856

基于STM32F1XX 、HAL库的BH1745NUC-E2环境光传感器驱动应用C语言程序设计

printf("BH1745制造商ID: 0x%02X\r\n", BH1745_ReadManufacturerID(&hbh1745));#define BH1745_ADDR_HIGH 0x39 // ADDR引脚接VDD。#define BH1745_ADDR_LOW 0x38 // ADDR引脚接地。= 0xE0) // BH1745制造商ID为0xE0。// 清除RGBC测量使能位。printf("BH1745初始化失败\r\n");

PP_Cottage的博客 280

CCF-CSP备考记录:201903-2 二十四点

CCF-CSP备考记录:201903-2 二十四点 题目 题目分析 本题目是对算术表达式的处理。 首先,把读取的中缀表达式转化为后缀表达式(方便后期计算处理): 如果是数字,直接加入后缀表达式末尾; 如果是操作符:若符号栈空,直接压入栈中;若栈不空,比较栈顶元素和此操作符的优先级, 若栈顶元素优先级高,则弹出栈顶,加入后缀表达式末尾,重复操作,直到不满足栈顶元素优先级高或栈空。把栈外操作符...

前进!前进!! 308

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

CCF 201903-2 二十四点

CCF 201903-2 二十四点 // // Created by asimov on 2020/3/20. //CCF //201903-2 二十四点 // #ifndef CSP_24P_H #define CSP_24P_H #endif //CSP_24P_H #include <bits/stdc++.h> using namespace std; stack<...

没有胡子的猫Asimov 194

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

CSP201903-2 二十四点

#include <iostream> #include <algorithm> #include <stack> #include <string> #include <vector> using namespace std; char op[] = {'+', '-', 'x', '/'}; int is_op(char ch)...

Skyler1017的博客 265

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

CCF-CSP 201903-2 二十四点

CCF-CSP 201903-2 二十四点问题描述代码总结 问题描述 代码 #include<iostream> #include<string> #include<stack> using namespace std; int main(){ int n; cin>>n; string s[n]; for(int i=0;i<n;i++){ cin>>s[i]; } stack<int> num;

SYSU_Zhiyuan 250

CSP 201903-2 二十四点

试题编号: 201903-2 试题名称: 二十四点 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 不知道为啥,结果就是50分,验证是对乘除处理不对,但是我自己设计的测试用例都能通过,就很烦。 #include <map> #include <cmath> #includ...

Yanpr919的博客 344

CCF CSP 201903-2 二十四点

试题编号: 201903-2 试题名称: 二十四点 时间限制: 1.0s 内存限制: 512.0MB 思路: 1.将四个数字和三个运算符分别用vector存储; 2.每次遍历运算符vector,寻找’x’或者’/’,然后进行运算,如果没有找到,则用第一个运算符进行运算; 3.每次运算后将参加运算的两个数字和运算符删去,在数字vector里对应位置插入运算结果;...

Yuhan的博客 321

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

问题描述 试题编号: 201903-2 试题名称: 二十四点 时间限制: 1.0s 内存限制: 512.0MB

WR的博客 2072
上一篇: CSP练习1:201903-1小中大
下一篇: CSP练习3:201812-01小明上学
coding_diamond
博客等级 码龄8年 8粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值