表达式计算

利用栈计算表达式的值 假设算术表达式只包含”+”、“-”、“*”、“/”、正整数和括号的合法数学表达式,求算术表达式值。 过程是:先将算术表达式转换成后缀表达式(逆波兰式),然后对该后缀表达式求值。   1)将算术表达式exp转换成后缀表达式postexp;   2)对后缀表达式postexp求值。 中缀表达式a*b+c变成后缀表达式是ab*c+ (1)中缀表达式转换成后缀表达式: a 阅读详情

题目

输入一个表达式,计算出它的值。运算符有 + - × / ( )。

思路

这是我们学栈时碰到的一个问题,大体方法是利用双栈把中缀表达式转换成后缀表达式进行计算

------------------------------------------------------------------------------------------------

1.拆分数字与运算符

:遇到运算符截断、存储、清空。

2.转后缀表达式

:栈A存放后缀表达式,栈B存放运算符
记 B栈顶运算符为a1,当前运算符为a2(若a2为数字直接 a2->A )
1)若 a1>a2,a1->A,a2->B
1)若 a1<a2,a2->B;
2)若 a1>=a2
1.若a1>a2,a1->A;(只要该条件满足则一直执行,使得优先级高的运算符放在A中)
2.将高级运算符都赶走后,要判断a1=a2 ?( 即是否为()相遇)
如果为左右括号的话就把做括号弹出,否则把a2->B。(注意与1的区别,一个)可以一直赶走比它高级的运算法,但是只能抵消一个左括号)
PS: a1>a2 表示 在此式中先算a1再算a2,a1与a2的关系在初始化中建立。

3.计算后缀表达式

: 从左往右扫描,遇到运算符则处理前两位数字
-------------------------------------------------------------------------------------------------

代码

#include <iostream>
#include <queue>
#include <stack>
#include <string>
#include <cstdio>
#include <cstdlib>
using namespace std;
string ss;
vector<double> ans;
vector<string> s,A;
stack<char> B;
int cmp[8][8]={	{1,1,-1,-1,-1,1},
				{1,1,-1,-1,-1,1},
				{1,1,1,1,-1,1},
				{1,1,1,1,-1,1},
				{-1,-1,-1,-1,-1,0},
				{1,1,1,1,0,0}};
int gec[333];
bool isNum(char a){
	switch(a){
			case '+':
			case '-':
			case '*':
			case '/':
			case '(':
			case ')':
				return false;
	}
	return true;
}
void init(){
	gec['+']=0;
	gec['-']=1;
	gec['*']=2;
	gec['/']=3;
	gec['(']=4;
	gec[')']=5;
}
void Quit(int v){
	cout << "ERROR : ";
	switch(v){
		case 1:
			cout << "DIVISION BY 0";
			break;
		case 2:
			cout << "PARENTHESES ARE NOT EVEN";
			break;
	}
	cout << endl;
	exit(0);
}
double gen(string s){
	double tmp;
	sscanf(s.c_str(),"%lf",&tmp);
	return tmp;
}
void check(){
	stack<char> q;
	for (string::size_type i(0);i!=ss.size();i++){
		if (ss[i]=='(') q.push(ss[i]);
		if (ss[i]==')') {
			if (q.empty()) Quit(2);
			if (q.top()=='(') q.push(ss[i]);
			else q.pop();
		}
	}
	if (q.size()) Quit(2);
}
void ready(){
	cin >> ss;
	check();
	ss+=')';
	string str="";
	for (string::size_type i(0);i!=ss.size();i++){
		if (isNum(ss[i])){
			str+=ss[i];
		}else {
			if (str.size()) s.push_back(str);
			str=ss[i];
			s.push_back(str);
			str="";
		}
	}
}
void changetype(){
	B.push('(');
	for (unsigned int i(0);i!=s.size();i++){
		if (isNum(s[i][0])){
			A.push_back(s[i]);
		}else{
			char ch=s[i][0];
			if (cmp[gec[B.top()]][gec[ch]]<0){
				B.push(ch);
			}else 
			if (cmp[gec[B.top()]][gec[ch]]>=0){
				string str;
				while (cmp[gec[B.top()]][gec[ch]]>0){
                    str=B.top();
                    A.push_back(str);
                    B.pop();
                }
                if (cmp[gec[B.top()]][gec[ch]]==0){
					B.pop();
				}else{
					B.push(ch);
				}
			}
			
		}
	}
}
void calcit(){
	for (int i(0);i!=A.size();i++){
		if (isNum(A[i][0])) {
			ans.push_back(gen(A[i]));
		}else{
			double a1=ans[ans.size()-2];
			double a2=ans[ans.size()-1];
			printf("%.2f%c%.2f=",a1,A[i][0],a2);
			switch (A[i][0]){
				case '+':
					a1+=a2;
					break;
				case '-':
					a1-=a2;
					break;
				case '*':
					a1*=a2;
					break;
				case '/':
					if (!a2){
						Quit(1);
					}
					a1/=a2;
					break;
			}
			printf("%.2f\n",a1);
			ans.pop_back();
			ans[ans.size()-1]=a1;
		}
	}
	printf("%.3f\n",ans[0]);
}
int main(){
	init();
	ready();
	changetype();
	calcit();
	return 0;
}


计算包含+、-、*、/、(、)等几种运算符的表达式的值。 package com.math; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Scanner; import java.util.Stack; /** * 表达式求值 */ public class Calculator { private static final int... 阅读详情

相关推荐

MFC停靠窗口实战:CDockablePane从创建到控件布局的完整指南(附残影问题排查)

本文提供了MFC中CDockablePane停靠窗口的完整实战指南,涵盖从自定义窗格类创建、主框架集成、内部控件布局到高级功能定制的全过程。针对开发中常见的“残影”视觉问题,文章深入剖析了其根源,并给出了系统性的排查步骤与解决方案,帮助开发者构建稳定、专业的可停靠用户界面。

sun99的博客 614

表达式的计算方法

表达式是有操作数和操作符,界符结果组成。由操作数的放置顺序,表达式可分为前缀表达式,后缀表达式,中缀表达式。表达式常通过堆栈来实现。

m0_67227115的博客 980

工程创新训练大赛智能网联车辆赛道LKA+自动驾驶9000+分数分案例

/获取主车在主车路径上的ST坐标。if (status == AVPStatus::eForwarding) // approaching the parking space接近阶段。if (status == AVPStatus::eForwarding) // approaching the parking space接近阶段。if (status == AVPStatus::eForwarding) // approaching the parking space接近阶段。

handsomeboyou的博客 1134

表达式的计算

一、前导知识 1、中缀表达式:通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法; 2、后缀表达式:又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面(例:3 4 +),所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则); 3、我们一般计算表达式用的都是中缀表达式,便于人类进行计算;但计算机并不...

qq_43575926的博客 2320

《哥谭神话-工程篇》01.Palantir 平台架构解析-混乱数据如何转化唯一真相源?

Palantir 平台的架构哲学可以概括为将洞察落地为行动,其核心是将“获取唯一真相”能力深度嵌入现有的、复杂的工作流程中,成为提升运营效率和决策质量的倍增器。

902

【论文阅读】High-Resolution Image Synthesis with Latent Diffusion Models

为了降低训练扩散模型的算力,LDMs使用一个Autoencoder去学习能尽量表达原始image space的低维空间表达(latent embedding),大大减少需要的算力。在RGB空间:编码器encoder:,将x压缩成低维表示解码器decoder: D,将低维表示z还原成原始图像空间。1. 加入Autoencoder(上图中左侧红色部分),使得扩散过程在latent space下,提高图像生成的效率;

weixin_57974242的博客 1万+

数据结构--计算表达式完整版(涉及乘方)

思路: (在描述优先级时,我们将加减描述为‘I’,乘除为‘II’,乘方为‘III’) 1.在之前的只有加减乘除的计算表达式里:就有了初步思路 当我们要计算的时候: 局部计算函数:数字栈与符号栈,分别在数字栈顶取出两个操作数,再在符号栈里取出对应的符号进行运算。 在只有加减乘除的计算中:我们只需要考虑两种情况来调用局部计算函数, 一:当存入一个数字压栈时,判断出符号栈顶是优先级的'*'或'/'时,直接进入计算函数。 二:当读到右括号时,进行while的计算函数操...

qq_60678811的博客 2093

JMeter 压测实战全教程

脚本结构:测试计划 → 线程组 → HTTP 请求 → 监听器运行方式:图形化调试,命令行生产压测核心指标:QPS、RT、错误率、CPU、GC。

weixin_48309090的博客 653

计算表达式的值

Description 输入一个只包含+,-,*,(,)的数字运算式(中缀表达式),求出他的计算结果。 例如,输入5*(7-3)+9,输出29 Input 一个中缀表达式。 Output 表达式的计算结果。 Sample Input 5*(7-3)+9 Sample Output 29 Hint 输入的表达式的长度不超过100,最终结果和中间结果不会超...

weixin_33940102的博客 3279

【人工智能】Spring AI项目在定义 `response_format` 的 Invalid schema for response_format ‘custom_schema‘

确保。

奶爸的编程之路,也就一周冷个三天 562

深度学习在移动开发中的应用:实时姿态估计实战

我们将使用TensorFlow Lite框架,结合专为移动端优化的MoveNet模型,实现一个能够在主流Android设备上达到30FPS的多人姿态跟踪解决方案,并深入探讨其优化技巧和实际应用场景。特别是3D姿态估计、多人长期跟踪等前沿技术的发展,将进一步推动移动端姿态估计技术的应用深度和广度。在下一篇文章中,我们将探讨深度学习在移动端的另一个创新应用:实时手势识别,包括如何在资源受限的环境中实现复杂手势的实时识别,以及这项技术在AR/VR交互、智能家居控制等场景中的应用。第四部分:典型应用场景实现。

Programming Talk 325

前缀表达式的计算

/前缀表达式计算:中缀表达式为 a-(b+c)(d/e) 前缀表达式为 -a*+bc/de 中缀表达式储存在数组A[]中,创建栈stack[],从后往前扫,从数组中取出字符,遇到数字进栈,遇到运算符就出栈两次,进行计算,计算结果入栈 注意字符类型转换*/ #include <stdio.h> #include <math.h> #include <stdlib.h> #define N 100 int judge_char(char c) { switch(c) {

qq_44700756的博客 3031

【数据集】中国各类水文专业常用数据集合集

对中国各类水文专业常用数据集进行整理并总结

WW、forever的博客 9307

计算表达式

题目描述 对于一个不存在括号的表达式进行计算 输入描述: 存在多种数据,每组数据一行,表达式不存在空格 输出描述: 输出结果 示例1 输入 6/2+3+3*4 输出 18 题目解析:知道符号的优先级,6/2+3+3*4 = 3 + 3 + 12,所以表达式实际上最后是一个加减式。优先计算出/,*的部分表达式,最后将结果加在一起。 代码: #include<stdio.h> #include<math.h> #include<algorithm> #include<s

Gedulding的博客 1744

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

Java实现计算表达式的值

需求 已知一个只含有()、+ 、-、*、\这五种操作符,数字只是整数,并且空格隔开的表达式字符串,求表达式的值。 例如: ( 3 + 4 ) * 5 - 6 结果为29 解题思路 给定表达式为中缀表达式,将其转为后缀表达式(逆波兰表达式)然后使用逆波兰表达式求解值。 逆波兰表达式求解值得思路: 遍历表达式,遇到数值则入栈,遇到计算符则从栈中弹出两个元素然后将计算结果压入栈中。做减和除法运算的时候...

Mr_Liuzhongbin的博客 4637

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

使用栈计算前缀表达式

介绍了怎样将中缀表达式转换为前缀表达式,并利用栈数据结构计算前缀表达式

guishangppy的博客 1628

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

后缀表达式的计算

1.中缀表达式转后缀表达式;2.后缀表达式的计算

YANG 3万+

计算WPS表格中带文本的计算表达式的结果

问题 最近,弟弟问我怎么从WPS表格中提取含文本的算术表达式中计算表达式的结果,如下表, 思路 利用正则表达式先提取数字,小数点,±*/()等符号,以获取完整的算术表达式 利用EVALUATE计算算术表达式的值 注意:提取的字符均为英文字符,且中文字符不能用小括号括起来 实现 提取表达式 选中“表达式”这一列的第一个单元格 输入=RegexString( 等待输入第一个参数时,选中“描述”...

tianzhiyi1989sq的博客 6162

利用广义表实现算数表达式的计算

利用广义表实现算数表达式的计算 第一次写这种博客,记录一下自己学习数据结构的一些些过程。 我记得网上有很多计算表达式的方式,前缀表达式、中缀表达式以及表达式之间的转换等。利用广义表实现这样的数据结构应该是最直接的一种转换方式。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,...

WJjjjjjjj155的博客 779

Access计算表达式

在MS Access中,表达式就像Excel中的公式。这包括一些可以单独使用或组合使用以产生结果的元素。表达式可以包括运算符,常量,函数和标识符。假设现在有一个新的Access数据库,包含更多的数据来计算。

unber的博客 1053

C++:表达式的计算

【代码】C++:表达式的计算。

qq_28414091的博客 1650
上一篇: Sublime Text 3 史上最性感的编辑器
下一篇: Linux 小白软件包整理
kzzhr
博客等级 码龄16年 53粉丝 59原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值