nyoj-409 郁闷的C小加(三) (表达式求值,中缀式转前缀式,中缀式转后缀式)

c语言实现中缀表达式转后缀并求值 c语言实现中缀表达式转后缀表达式并求得计算结果,用顺序栈结构。 当输入者输入错误信息的时候需要报错,并说明错误的种类。 立即下载

郁闷的C小加(三)

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述
聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为前缀和后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。
输入
第一行输入一个整数T,共有T组测试数据(T<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数并且小于1000000。
数据保证除数不会为0。
输出
对于每组测试数据输出结果包括三行,先输出转换后的前缀和后缀表达式,再输出计算结果,结果保留两位小数。
样例输入
2
1+2=
(19+21)*3-4/5=
样例输出
+ 1 2 =
1 2 + =
3.00
- * + 19 21 3 / 4 5 =
19 21 + 3 * 4 5 / - =
119.20


思路: 找到规律、确定优先级即可,个人感觉中缀转前缀较难想,倒叙遍历中缀表达式寻找规律。。


代码:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stack>
#define N 1050

using namespace std;

char s[N];
stack<double>Num;			// 数据栈 
stack<char>Ope;				// 符号栈 

double JieXi();
double JiSuan();

void To_Prefix(){			// 中缀式转前缀式
	char n[N * 3] = {"\0"};				// n 数组保存前缀式 
	int len = strlen(s), ni = 0;		// ni 为 n 数组的下标 
	
	for(int i = len - 2; i >= 0; i --){			// 倒叙遍历s数组 
		if(isdigit(s[i]) || s[i] == '.'){		// 数字直接保存到前缀式数组 
			n[ni ++] = s[i];
		}
		else{
			if(ni != 0 && n[ni - 1] != ' '){	// 遇到非数字加空格,但要排除最后一个字符是括号(即ni = 0 还没有数字进入)的情况 
				n[ni ++] = ' ';
			}
			switch(s[i]){
				case '+':						// +、- 优先级低于 *、/ 
				case '-':
					while(!Ope.empty() && (Ope.top() ==  '*' || Ope.top() == '/')){
						n[ni ++] = Ope.top();
						n[ni ++] = ' ';
						Ope.pop();
					}
					break;
				case '*':						// * 、 ) 直接进栈 
				case '/':
				case ')':
					break;
				case '(':						// 右括号时,将栈中)前的放入前缀式数组 
					while(Ope.top() != ')'){
						n[ni ++] = Ope.top();
						n[ni ++] = ' ';
						Ope.pop();
					}
					Ope.pop();
					break;
			}
			
			if(s[i] != '('){					// 左括号不进栈 
				Ope.push(s[i]);
			}
		}
	}
	
	while(n[ni - 1] == ' '){					// 先消去前缀式数组尾部的空格,与下方统一 
		ni --;
	}
	while(!Ope.empty()){						// 将栈中元素弹出,存入前缀式数组 
		n[ni ++] = ' ';
		n[ni ++] = Ope.top();
		Ope.pop();
	}
	for(int i = ni - 1; i >= 0; i --){			// 输出前缀式 
		printf("%c", n[i]);
	}
	printf(" =\n");
}

void To_Postfix(){			// 中缀式转后缀式 
	for(int i = 0; ; i ++){
		if(isdigit(s[i]) || s[i] == '.'){		// 数字直接输出 
			printf("%c", s[i]);
		}
		else{
			if(i > 0 && isdigit(s[i - 1])){		// 数字后输出空格 
				printf(" ");
			}
			
			switch(s[i]){
				case '(':						// ( 直接入栈 
					break;
				case ')':						//  出栈输出、直至遇到 ( 
					while(Ope.top() != '('){
						printf("%c ", Ope.top());
						Ope.pop();
					}
					Ope.pop();					// 弹出( 
					break;
				case '+':						// +、-、= 优先级最低,只要栈不空栈顶不是(, 则出栈输出 
				case '-':
				case '=':
					while(!Ope.empty() && Ope.top() != '('){
						printf("%c ", Ope.top());
						Ope.pop();
					}
					break;
				case '*':						// *、/ 优先级高,只有栈顶是 * / 时才输出 
				case '/':
					while(!Ope.empty() && (Ope.top() == '*' || Ope.top() == '/')){
						printf("%c ", Ope.top());
						Ope.pop();
					}
					break;		
			}
			
			if(s[i] == '='){
				printf("=\n");
				break;
			}
			else{
				if(s[i] != ')'){				// ) 不入栈 
					Ope.push(s[i]);
				}
			}
		}
	}
}

int main(){
	int loop;
	scanf("%d", &loop);
	while(loop --){
		scanf(" %s", s);
		
		To_Prefix();				// 中缀转前缀 
		To_Postfix();		 		// 中缀转后缀 
		
		double ans = JieXi();		// 表达式求值 
		printf("%.2lf\n", ans);
	}
	
	return 0;
}

///////////////////////// 下为之前表达式求值代码 ////////////////////////////////

double JieXi(){					// 表达式求值 —解析函数 
	int i = -1, ni = 0;			// i为输入表达式(字符串)下标 ,ni为num数组下标; 
	char num[100] = {"\0"};		// 暂存数字字符和小数点,用于将字符串转换为数字 
	double ans = 0;				// 记录每一次计算的结果 
	
	while(1){
		i ++;
		
		if(isdigit(s[i]) || s[i] == '.'){				// 如果当前字符是数字或小数点,将其直接放入数字暂存数组 
			num[ni ++] = s[i];
		}
		else{											// 当前字符为运算符 
			if(ni != 0){								// 如果数字暂存数组中有数据,转换成数字,并压入数据栈 
				sscanf(num, "%lf", &ans);
				Num.push(ans);
				memset(num, '\0', sizeof(num));			// 入栈后清空暂存数组,其下标置零 
				ni = 0;
			}
						
			switch(s[i]){								// 分析运算符,并开始计算 
				case '+':
				case '-':
				case '=':
					while(!Ope.empty() && Ope.top() != '('){		// 其它运算符优先级都高于+、-、=,先全部运算直至符号栈栈顶为'('或栈空 
						ans = JiSuan();
						Num.push(ans);								// 记得将运算结果压入数据栈,当前运算符break后压入 
					}
					break;
				case '*':
				case '/':
					while(!Ope.empty() && (Ope.top() == '*' || Ope.top() == '/')){
						ans = JiSuan();
						Num.push(ans);
					}
					break;
				case ')':
					while(Ope.top() != '('){			// 运算直至符号栈栈顶为( 
						ans = JiSuan();
						Num.push(ans);
					}
					Ope.pop();							// 将栈顶的(弹出 
					break;
				case '(':								// ( 之后直接如符号栈即可,无需运算 
					break;
			}
			
			if(s[i] == '='){
				Num.pop();						// 此次弹出后,数据栈已清空;并且在之前运算中符号栈已清空(有运算符就有运算) 
				break;			 				// 运算结束 
			}
			else{
				if(s[i] != ')'){				// )、=不入栈,其余运算符都入栈 
					Ope.push(s[i]);
				}
			}
		}
	}
	
	return ans;	
}

double JiSuan(){					// 计算函数,自身从栈中取数据 
	double b = Num.top();
	Num.pop();
	double a = Num.top();
	Num.pop();
	char c = Ope.top();
	Ope.pop();

	switch(c){
		case '+':
			return a + b;
		case '-':
			return a - b;
		case '*':
			return a * b;
		case '/':
			return a / b;
	}
}


中缀表达式求值实验报告及源码 设计思路:为了设计一个完整运算器,可以采用将中缀表达式转化为后缀表达式进行求解。具体思路: 第一步:先初始化两个栈,分别盛放操作数和操作符; 第二步:将输入的字符串去掉空格,从字符串开头开始遍历; 第三步:若遇到的字符位数字,利用标记判断其是否为小数位及小数位的第几位,存在temp变量中,若不为 立即下载

相关推荐

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

NYOJ-128前缀式计算

  前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式。 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) ) 把括号去掉就是:+ 2 * + 3 4 5 最后这个式子就是该表...

weixin_33743661的博客 328

实战指南:从零搭建ROS2 + Cartographer 2D激光SLAM系统

本文详细介绍了如何从零开始搭建ROS2与Cartographer结合的2D激光SLAM系统,涵盖环境准备、激光雷达驱动配置、Cartographer安装与参数调优等关键步骤。通过实战案例和常见问题解决方案,帮助开发者快速掌握激光雷达建图技术,提升机器人自主导航能力。

weixin_29062255的博客 403

前缀式计算 nyoj

题目描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式。 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) ) 把括号去掉就是:+ 2 * + 3 4 5 最后这个式子就是该表达式的前缀表示。 给你一个前缀表达式,请你计算出该前缀式的值。 比如: + 2 * + 3 4 ...

weixin_30587927的博客 136

腾讯游戏安全组件运行异常的全面解决方案

在使用腾讯游戏时,玩家可能会遭遇游戏安全组件运行异常的问题,这不仅影响游戏的正常启动,还可能在游戏过程中引发一系列问题。本文将详细介绍解决腾讯游戏安全组件运行异常的几种方法,帮助玩家重拾游戏乐趣。腾讯游戏安全组件运行异常是一个复杂的问题,可能涉及服务设置、游戏更新、系统环境优化以及硬件与驱动检查等多个方面。最后,希望本文能帮助玩家顺利解决腾讯游戏安全组件运行异常的问题,让玩家能够无忧无虑地享受游戏带来的乐趣。首先,我们需要从系统的服务管理入手,检查与游戏安全组件相关的服务是否正常运行。

nntxthml的博客 5811

期货分仓系统CTP协议/国内期货软件源码

期货分仓系统与CTP协议以及国内期货软件源码是期货交易技术领域的几个重要方面。

q2247238820的博客 962

前缀式计算

前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式。 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) ) 把括号去掉就是:+ 2 * + 3 4 5 最后这个式子就是该表达式的前缀

wanghandou的博客 2492

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

m0_45877477的博客 1633

NYOJ - 郁闷的C小加(一)

郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 我们熟悉的表达式如a+b、a+b*(c+d)等都属于中缀表达式。中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2。同理,后缀表达式就是操作符在两个操作数之后:num1 num2 operand。ACM队的“C小加”正在郁闷怎样把一个中缀表达

SevenMIT的专栏 1475

【生物识别模组介绍】静脉识别模组

静脉识别技术是依据流动的静脉血液中的血红蛋白对近红外光有所吸收,通过近红外光照射手指、手掌、面部、腕部呈现的分布图像,再使用特定的算法对图像进行特征提取、分析比对,从而进行身份认证识别。静脉结构相同几率为34亿分之一,每个人的静脉结构具有独特性,而且静脉特征图像自成年后终身不变,不受外部环境、疾病等影响,是人体最稳定的生物特征之一。商务合作联系:newmagicmission@gmail.com图1.0。

upupDay's blog 901

手把手教你学simulink(31.17)--双向DCDC电源场景示例:基于simulink 的双向DCDC应用:车载充电器的pi控制

通过引入PI控制器,系统可以更精确地控制电压和电流,确保充电和放电过程的稳定性和高效性。

MHD0815的博客 205

NYOJ 409 郁闷的C小加(三)

郁闷的C小加(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为前缀和后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。 输入第一行输入一

倚世独殇 733

【AutoSAR CAN】04 - 如何使用Davinci Configurator Pro工具配置CAN的波特率

改参数为Tx Arbitration start delay value ,可用于延迟仲裁过程的起始点,用来补偿CAN收发器及线路的传输延迟,以优化传输性能。有关详细信息,请参阅硬件手册。该参数指定采样点模式,即选择多少个采样点的数量,如果选择了每比特三个样本选项,则该点标记第三个样本的位置;我们要配置CAN的波特率,其实就是要弄明白 CAN 控制器的位时序即可,具体的理论部分和EB的配置部门可参考文章《该参数表示传播延迟有多少个时间单位Tq,即上文中的Propagation delay/PROGSEG。.

2601

NYOJ409 郁闷的c小加三

传送门:http://acm.nyist.net/JudgeOnline/problem.php?pid=409 NYOJ郁闷的c小加一、二、三都是关于表达式转换及求值的,主要涉及栈知识点。郁闷的c小加三是在二的基础上多了个前缀表达式,因此可以稍作修改把一二A掉。 这道题就是将表达式转换成前缀和后缀表达式,并输出计算结果,因此可以定义一个result结构体,string型的s1、s2以及dou

Lazy 1651

iOS逆向之深入解析Hook的原理方法和安全防护

Hook简介 Hook就是一种改变程序执行流程的一种技术的统称; 一段程序的执行流程是 A --> B --> C,现在我们在 A 和 B 之间插入一段代码或者直接改变 B ,这样程序原有的执行流程就发生了改变。如下图所示: Hook的方式:Method Swizzle,fishhook,Cydia Substrate; Hook原理 一、Method Swizzle 原理 利用OC的Runtime特性,动态去改变SEL(方法编号)和IMP(方法实现)的对应关系,达到OC方法调用流程改变

╰つ栺尖篴夢ゞ 2万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

nyoj 409——郁闷的C小加(三)——————【中缀式化前缀后缀并求值】

郁闷的C小加(三) 时间限制:1000ms | 内存限制:65535KB 难度:4 描述聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为前缀和后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。 输入第一行输入一个整数T...

weixin_30302609的博客 126

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

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

郁闷的C小加(三)(nyoj 409)

郁闷的C小加(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为前缀和后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。 输入第一行输入一

23333333 714

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

nyoj 题目409 郁闷的C小加(三)

郁闷的C小加(三) 时间限制:1000 ms  |            内存限制:65535 KB 难度:4 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为前缀和后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。 输入第一行

成长ing 529

NYOJ 409 郁闷的C小加(三)

题目信息: 郁闷的C小加(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为前缀和后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。

428

郁闷的C小加(三)

郁闷的C小加(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为前缀和后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。 输入第一行输入一个整数T,共有

wanghandou的博客 358

NYOJ 35 表达式求值 or 267 郁闷的C小加(二)

描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。 输入第一行输入一个整数T,共有T组测试数据(T 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=

Rookie的博客 501

nyoj-257 郁闷的C小加(一)

看大神的代码看了好久,我自己感觉不太好理解 代码:#include #include #include #include using namespace std; char str[1200]; int fun(char ch){ //对优先级进行预定义 switch(ch){ case '+': ; case '-': return 1; break; case '*': ;

wojiaohuangyu的专栏 730

中缀转前缀(后缀)表达式,前缀(后缀)表达式求值

中缀转前缀 eg: (3+5)*7 我们按照如下步骤将其转换为前缀表达式: 由于前缀表达式要求运算符在操作数之前,所以必须从后向前扫描中缀表达式 定义prefix=[] 扫描到7,一个操作数什么也干不了,所以prefix=[7] 扫描到*,此时什么也干不了,先记住*号 扫描到5,5和7之间由于有括号,不能算乘法,所以prefix=[5,7] 扫描到+,由于括号的存在,此时什么也干不了,记住+号 扫描到3,由于3和5可以算加法,所以prefix=[+,3,5,7] 由于3+5的结果可以和7算乘法,所以pre

xhsun的博客 850

表达式求值以及中缀式转后缀式代码

#include &amp;lt;iostream&amp;gt;//数据结构表达式计算 #include &amp;lt;algorithm&amp;gt; #include &amp;lt;stack&amp;gt; #include &amp;lt;cstdio&amp;gt; #include &amp;lt;cmath&amp;gt; #include &amp;lt;cstring&amp;gt;

ZWHSOUL的博客 479
上一篇: nyoj-239 月老的难题 (二分图匹配—匈牙利算法 && 网络流—Dinic算法)
下一篇: 第一个Win32窗口程序
tbl00c
博客等级 码龄13年 21粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值