四则运算表达式求值(可以计算小数和带括号)

四则运算表达式(c++实现) 算法 中缀表达式->后缀表达式 这里特别推荐浙江大学的《数据结构》慕课,2.2.4节堆栈应用:表达式求值,讲的特别好!包教包会! 后缀表达式求值 从头到尾读取后缀表达式的每个对象,对不同对象按不同情况处理。 (1) 运算数:压入堆栈 (2) 运算符:弹出栈顶两个运算数,与运算符做运算,计算结果压栈 最终栈中剩余的数字即为运算结果。   C++代码 #include<... 阅读详情


若有疑问,请联系simonsliu9@gmail.com,一定尽快回复

求一个可以带括号的小学算术四则运算表达式的值

input

一行,一个四则运算表达式。’*‘表示乘法,’/'表示除法
输入样例1:
3.4
输入样例2:
7+8.3
输入样例3:
3 + 4.5 ∗ ( 7 + 2 ) ∗ ( 3 ) ∗ ( ( 3 + 4 ) ∗ ( 2 + 3.5 ) / ( 4 + 5 ) ) − 34 ∗ ( 7 − ( 2 + 3 ) ) 3+4.5*(7+2)*(3)*((3+4)*(2+3.5)/(4+5))-34*(7-(2+3)) 3+4.5∗(7+2)∗(3)∗((3+4)∗(2+3.5)/(4+5))−34∗(7−(2+3))

output

一行,该表达式的值,保留小数点后面两位
输出样例1:
3.40
输出样例2:
15.30
输出样例3:
454.75

主要实现功能

  1. 判断左括号
  2. 判断有括号
  3. 判断数字,有小数需要判断
  4. 判断符号,计算
  5. 不断弹出计算

实现过程

头文件导入

会用到stack来对数字和符号进行存储,也会用到string

#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
定义全局变量

需要的全局变量:
用来存储表达式的字符数组s,保存每一个数字的用作中间变量字符数组temp
符号栈opt,数字栈item

const int maxn = 1000; // 常量
char s[maxn], temp[maxn];
// 一个用于保存表达式,一个用于保存数字从字符数组转化成double变量的中间变量
stack<char> opt;//符号栈
stack<double> item;//数字栈
主要功能函数
  1. 将字符数组转化成数字 double str2double(char s[])
    这个函数一般是将temp中保存的字符数组形式的数字转化成double类型,考虑了小数点
double str2double(char s[]) {
	int len = strlen(s);
	double sum1 = 0;
	double sum2 = 0;
	bool flag = false;
	for (int i = 0; i < len; i++) {
		if (s[i] == '.') {
			flag = true;
			break;
		}
		sum1 = sum1 * 10 + s[i] - '0';
	}
	if (flag) {
		for (int i = len - 1; i >= 0; i--) {
			if (s[i] == '.') break;
			sum2 = (sum2 + s[i] - '0') / 10.0;
		}
	}
	return sum1 + sum2;
}
  1. 运算符优先级比较函数int priority(char ch)
int priority(char ch) {
	if (ch == '*' || ch == '/') return 2;
	if (ch == '+' || ch == '-') return 1;
	return 0;
}
  1. 计算函数void cal()
void cal() {
	double x = item.top(); 
	item.pop();
	double y = item.top(); 
	item.pop();
	switch (opt.top()) {
	case '+': y += x; break;
	case '-': y -= x; break;
	case '*': y *= x; break;
	case '/': y /= x; break;
	}
	item.push(y);
	opt.pop();
}
  1. 主函数
int main() {
	scanf("%s", s); // 输入字符串
	int len = strlen(s); // 字符串长度
	int cnt = 0; // 中间变量temp的游标
	int i = 0;   // 对字符串进行遍历的右边
	bool flag = false; // 对开头字符是负号的处理flag
	// 如果开头是负号,则flag=true,然后表达式遍历游标i+1
	if (s[i] == '-') flag = true, i = 1; 
	// 开始遍历表达式
	while (i < len) {
	    // 如果为左括号,则进栈,游标后移
		if (s[i] == '(') opt.push(s[i]),i++;
		// 如果为右括号,则计算括号中的值
		else if (s[i] == ')') {
			while (opt.top() != '(') cal();
			opt.pop();
			i++;
		}
		// 如果为数字或者小数点
		else if (s[i] <= '9' && s[i] >= '0' || s[i] == '.') {
		    // 不断的循环,把一个数存入中间变量temp中,然后temp的游标后移,i也后移
			while (s[i] <= '9' && s[i] >= '0' || s[i] == '.') temp[cnt++] = s[i++];
			// 给中间变量的末尾加一个‘0’,意思表示结尾,便于str2double中计算temp的长度
			temp[cnt] = 0;
			// 将temp转化为对应的浮点数,然后存入数字栈item中,考虑是否为负数
			if (flag) item.push(-str2double(temp)), flag = false;
			else item.push(str2double(temp));
			// 然后temp的游标归零,便于下一次存储数字
			cnt = 0;
		}
		// 如果为计算符号
		else {
		    // 符号栈opt不为空,同时游标指向的符号的优先级小于栈顶符号优先级,则进行计算
			while (!opt.empty() && priority(s[i]) < priority(opt.top())) cal();
			// 把当前符号压栈,因为当前符号比栈顶符号优先级大,所以不能拿栈顶符号进行计算
			opt.push(s[i]);
			i++;
		}
	}
	// 这种情况,是里面的优先级计算顺序已经调整好,直接进行计算
	while (!opt.empty()) cal();
	printf("%.2lf\n", item.top());
	return 0;
}

完整代码

#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;

const int maxn = 1000;
char s[maxn], temp[maxn];
stack<char> opt;//符号栈
stack<double> item;//数字栈

double str2double(char s[]) {
	int len = strlen(s);
	double sum1 = 0;
	double sum2 = 0;
	bool flag = false;
	for (int i = 0; i < len; i++) {
		if (s[i] == '.') {
			flag = true;
			break;
		}
		sum1 = sum1 * 10 + s[i] - '0';
	}
	if (flag) {
		for (int i = len - 1; i >= 0; i--) {
			if (s[i] == '.') break;
			sum2 = (sum2 + s[i] - '0') / 10.0;
		}
	}
	return sum1 + sum2;
}
int priority(char ch) {
	if (ch == '*' || ch == '/') return 2;
	if (ch == '+' || ch == '-') return 1;
	return 0;
}
void cal() {
	double x = item.top(); item.pop();
	double y = item.top(); item.pop();
	switch (opt.top()) {
	case '+': y += x; break;
	case '-': y -= x; break;
	case '*': y *= x; break;
	case '/': y /= x; break;
	}
	item.push(y);
	opt.pop();
}
int main() {
	scanf("%s", s); // 输入字符串
	int len = strlen(s); // 字符串长度
	int cnt = 0; // 中间变量temp的游标
	int i = 0;   // 对字符串进行遍历的右边
	bool flag = false; // 对开头字符是负号的处理flag
	// 如果开头是负号,则flag=true,然后表达式遍历游标i+1
	if (s[i] == '-') flag = true, i = 1; 
	// 开始遍历表达式
	while (i < len) {
	    // 如果为左括号,则进栈,游标后移
		if (s[i] == '(') opt.push(s[i]),i++;
		// 如果为右括号,则计算括号中的值
		else if (s[i] == ')') {
			while (opt.top() != '(') cal();
			opt.pop();
			i++;
		}
		// 如果为数字或者小数点
		else if (s[i] <= '9' && s[i] >= '0' || s[i] == '.') {
		    // 不断的循环,把一个数存入中间变量temp中,然后temp的游标后移,i也后移
			while (s[i] <= '9' && s[i] >= '0' || s[i] == '.') temp[cnt++] = s[i++];
			// 给中间变量的末尾加一个‘0’,意思表示结尾,便于str2double中计算temp的长度
			temp[cnt] = 0;
			// 将temp转化为对应的浮点数,然后存入数字栈item中,考虑是否为负数
			if (flag) item.push(-str2double(temp)), flag = false;
			else item.push(str2double(temp));
			// 然后temp的游标归零,便于下一次存储数字
			cnt = 0;
		}
		// 如果为计算符号
		else {
		    // 符号栈opt不为空,同时游标指向的符号的优先级小于栈顶符号优先级,则进行计算
			while (!opt.empty() && priority(s[i]) < priority(opt.top())) cal();
			// 把当前符号压栈,因为当前符号比栈顶符号优先级大,所以不能拿栈顶符号进行计算
			opt.push(s[i]);
			i++;
		}
	}
	// 这种情况,是里面的优先级计算顺序已经调整好,直接进行计算
	while (!opt.empty()) cal();
	printf("%.2lf\n", item.top());
	return 0;
}
C++ 数据结构 算数表达式求值——栈存储 数据结构实习——算术表达式求值 一、实习题目及要求 1、题目:算术表达式求值 2、要求: (1)正确解释表达式; (2)符合四则运算规则: (3)先乘除、后加减; (4)从左到右运算; (5)先括号内,后括号外; (6)输出最后的计算结果。 二、问题描述 1、对一个合法的中缀表达式求值。 2、假设表达式只包含+、-、*、/ 四个双目运算符,并且允许有括号出现,运算符本身不具有二义性。 三、问题分析... 阅读详情

相关推荐

Java实现表达式求值

代码置于文章末 本文代码未使用栈 问题描述 输入一个表达式,表达式可以包括‘+’,‘-’,‘*’,‘/’,‘%’运算,可以出现整数及小数,可以出现“()”,但要求输入格式合法。 总体思路 当输入的表达式(下称s)中存在“()”时,对“()”内的表达式进行运算,并在s中将该“()”及其之中的表达式替换为运算结果; 直至s中无“()”,对s进行运算,输出结果。 运算思路 现在我们只需要考虑如何计算出一个没有“()”的表达式即可。 首先,明确:‘*’,‘/’,‘%’的运算优先级相同,且高于‘+’,‘-’,而‘+’

weixin_44329588的博客 1881

【数据结构】【栈(stack)应用】四则运算表达式求值(支持括号、负数)

更新留言: 本来是侧重演示栈结构的使用,后面评论区发现很多朋友对这个四则运算比较感兴趣,特此做了更新,新增了对负数的运算支持。 若您也有新的想法或者需求,请在评论区留言,我将尽可能的实现。需要代码的朋友请直接在章末获取。 再次感谢您的阅览,谢谢!(更新时间2023年12月05日)

crr411422的博客 2万+

基于链栈实现的四则运算表达式求值项目

链栈的基本单位是“结点”(Node),每一个结点包含两个主要部分:数据域用于存储实际的数据元素,如整数、浮点数或其他自定义类型;指针域则指向下一个相邻的结点,形成单向链式结构。由于栈的操作仅发生在顶部,因此只需维护一个指向栈顶结点的头指针即可完成所有操作。以 C 语言为例,典型的链栈结点结构可定义如下:// 数据域:支持浮点运算// 指针域:指向下一个结点上述代码使用typedef简化结构体类型的声明,使后续变量定义更加简洁。data字段采用double类型而非。

weixin_33256096的博客 1067

表达式计算 四则运算(有括号)的计算

问题描述   输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。 输入格式   输入一行,包含一个表达式。 输出格式   输出这个表达式的值。 样例输入 1-2+3*(4-5) 样例输出 -4 数据规模和约定   表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

南宫封清的博客 2733

表达式求值(带括号的四则运算)

使用STL和求值算法,编写的求一个长串表达式的值,包括了+-/*以及带括号的运算的混合运算,只要调用它就可以方便的求出结果了,也可以放在自己的程序里! 例如:char *express = "5+37/5+(38-2)/2-10+(3+2)/(10-7)*(16-5)-3"; printf("%s\n",CExpress::GetExpressVal(express,strlen(express)).c_str());

变色龙哈希函数 Chameleon Hash 可变型区块链

哈希函数 Hash: 众所周知,区块链有着极其优秀的安全性就是因为其充分使用了哈希函数。 哈希简单用一句话来讲,就是:将任意长度输入的字串可转换成一个固定长度的字串,通过原始字串可以很容易地算出转换后的字串,通过转换后的字串很难还原出原始字串。 哈希函数特征: 1. 对于任意m作为输入,得到输出的结果,很难找到另一个输入m'  (m'不等于m),使得m'的Hash结果也为同样的输出

新手村 1万+

算法——模拟四则运算

给定一个包含正整数、加(+)、减(-)、乘( * )、除(/)的算数表达式(括号除外),计算其结果。 表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。 leetcode 解题思路:模拟CPU进行运算的方式,利用栈的思想。遍历字符串,如果遇到符号,则读取下一个数字,然后判断符号。 如果是乘除,那么直接拿这个数字和栈顶元素运算。 如果是减号,则将当前元素变为负数。 如果是加号,则不操作。 运算完成符号之后,再将处理过的数值放到栈顶。 最后完成遍历,将栈中的元素都.

Think Different. 885

西门子S7通信协议TSAP配置全攻略:从默认值到自定义修改(附各型号对照表)

本文深入解析西门子S7通信协议中TSAP配置的核心原理与实战方法。针对S7-200/300/400/1200/1500等主流PLC型号,提供了默认TSAP对照表,并详细阐述了如何根据机架号和插槽号计算或自定义Remote TSAP。文章结合常见连接失败案例,给出了系统化的排错流程,旨在帮助工程师快速打通S7通信链路,提升工业自动化现场调试效率。

weixin_29163797的博客 278

数据结构课程设计四则运算表达式求值(C语言版)

  明人不说暗话,直接上百度网盘链接,输入提取码z3fy即可下载。 文件中包含程序,程序运行文件,设计报告和测试样例,应有尽有,欢迎小伙伴们在中下载使用。 本课程设计为四则运算表达式求值,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值。注意事项: 1、请保证输入的四则表达式的合法性。输入的中缀表达式中只能含有英文符号“+”、“-”、“*”、“/...

aisebu7819的博客 4530

伺服系统控制原理深度解析

摘要:本文系统阐述了伺服系统的控制原理与应用。首先介绍了伺服系统的定义、组成及其在工业自动化中的重要性;然后详细分析了反馈控制机制、稳定性判据和性能指标;重点推导了传递函数和状态空间两种数学模型,并通过LaTeX公式展示了二阶系统建模过程;进而对比了PID控制、状态反馈及自适应控制等方法的优缺点;最后结合数控机床等案例,验证了理论方法的有效性,并展望了伺服系统智能化发展趋势。全文兼顾理论深度与实践指导性,为控制工程领域提供了系统的技术参考。

技术工作者 1266

ros_gz_bridge__镜像__readme

Run。

1113

C++二叉树实现四则运算表达式计算(支持无限叠加括号,负数,小数,多位数字)

二叉树实现表达式计算有很多优点,首先它的先序遍历是前缀表达式(波兰表达式),中序遍历是中缀表达式,后序遍历是(逆波兰表达式),最后再进行计算的时候通过不同的遍历可以采用不同的算法。

2302_80253020的博客 1912

Avalonia 超级详细学习指南

什么是 Avalonia?Avalonia 是一个开源的、跨平台的 GUI 框架,允许开发者使用 XAML 和 C# 构建现代化、高性能的桌面应用程序。与其他框架相比,Avalonia 具有强大的跨平台能力和灵活的界面设计。} }()Avalonia 的特点和优势跨平台性:Avalonia 可以在 Windows、Linux、macOS 等多个平台上运行,开发者可以编写一套代码,然后在不同的操作系统上运行相同的应用程序。

仰望星空的博客 1万+

算数四则混合运算表达式求值

算数混合四则运算求值 [问题] 利用算符优先关系,实现对算术四则混合运算表达式的求值 [要求] 输入的形式:表达式,例如2*(3+4) 包含的运算符只能有’+’ 、‘-’ 、‘*’ 、‘/’ 、‘(’、 ‘)’; 输出的形式:运算结果,例如2*(3+4)=14; 程序所能达到的功能:对表达式求值并输出 思路:利用栈实现表达式求值,需要思考如下问题: 算符的优先级 字符转换成数字(包括解析小数) 主要思路: 算术表达式有三种类型:前缀,中缀,后缀表

~ 2165

如何使用Python爬取并保存网页上的所有附件

爬虫(Crawler)是一种自动化程序,它通过模拟人工访问网页并下载网页上的数据或文件,常用于数据采集和分析。爬虫通常以“爬取”的形式自动浏览和提取网页中的各种信息。本文详细介绍了如何使用Python爬取并保存网页中的附件文件,涵盖了网页解析、文件下载、多线程与异步优化等内容。希望通过本文的讲解,能够帮助你理解并掌握附件爬取的技巧。在实际应用中,爬虫开发不仅需要解决技术问题,还要遵守网络道德和法律法规,避免不当使用爬虫造成负面影响。

2201_76125261的博客 967

第1章:认识OpenClaw

OpenClaw是一个开源的 AI 智能体 Gateway 网关项目名称演变:OpenClaw 原名 Clawdbot,因 Anthropic 商标顾虑在 2026年1月27日更名为 Moltbot(过渡名),最终在1月30日确定为 OpenClaw。三个名字本质是同一个项目,功能完全一致。🏠在你的电脑上运行:完全本地部署,数据隐私有保障📁访问本地文件:可以搜索、读取、编辑你电脑上的文件🔌扩展能力:通过Skills(技能)系统无限扩展功能💬多平台使用。

Maynor的博客 2834

链式栈实现四则运算,表达式可包含括号,可计算小数

由于代码中的注释已较为详尽,在此就只贴代码了 ExprCPro.cpp #include "pch.h" #include"Expr.h" #include <iostream> using namespace std; int main() { cout << "-------------表达式求值--------------" <&l...

qq_45414669的博客 740

剪映专业版关键帧完全教程:从原理到实战的动画必修课

关键帧是视频动画的核心原理。视频由连续静止画面(帧)构成,关键帧记录素材属性变化的起始与结束状态,中间过渡帧由软件自动计算生成。剪映专业版中,视频、音频、文本、贴纸等素材均支持关键帧动画,可调节位置、缩放、旋转、不透明度、音量等参数。操作为:在起始位置点击参数旁菱形按钮添加关键帧,移动播放头后调整参数,系统自动生成第二个关键帧。多属性可独立控制并叠加,实现放大同时淡出等复合效果。通过设定变化起点与终点,关键帧能让静止元素产生移动、缩放、淡入淡出等丰富动态,是视频剪辑从基础拼接进阶创意表达的核心技能。掌握关键

深耕计算机专业知识与技术。 2092

C++表达式求值

MFC表达式求值 表达式求值问题: 完成类似如下界面所示的表达式求值软件,输入包含加﹑减﹑乘﹑除﹑括号等运算符和0-9数字的表达式,输出表达式计算结果。 扩展要求(选作): (1)表达式包含多位整数甚至是小数,如(2.5+3.15)/0.69; (2)表达式包含特定函数,如: 1+sin(5+2/3)*3; 提交: 程序源代码(含注释)﹑程序报告文档,打包成压缩文件在课程网站上按规定时间提交。 补充说明: 编程语言:C/C++ 框架:MFC 支持的特定函数:sin、cos、tan等 实现含括号优先级、四则

程序设计 3975

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

四则运算表达式求值(栈的应用)

1.前/中/后缀表达式的转换(首先需要明白三者之间的转换)      自然表达式转换为前/中/后缀表达式,其实是很简单的。首先将自然表达式按照优先级顺序,构造出与表达式相对应的二叉树,然后对二叉树进行前/中/后缀遍历,即得到前/中/后缀表达式。     举例说明将自然表达式转换成二叉树:     a×(b+c)-d     ① 根据表达式的优先级顺序,首先计算(b+c),形成

yzl_rex 3万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

四则运算表达式求值 中缀转后缀然后求值 (有括号)

参考算法笔记,数据结构部分栈的内容 计算中缀表达式,先转换成后缀表达式,再计算 #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <map> #include <string> #include <vector> #include <algorithm> #include <queue&gt

zpf1998的博客 436

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

四则运算(可含括号)表达式求值问题

算法学习第六篇 输入一个行数再在每行输入一个表达式,得出结果,这是一道非常经典的OJ题目,有一定的难度,CCF中也出现过类似的题目,大同小异,此题目难点集中在以下几点: 1.判断符号优先级 2.考虑括号问题 3.字符串如何计算,涉及到栈的灵活运用 4.结果的格式问题 输入表达式输出结果,如果是小数则保留两位小数,四舍五入,整数运算直接取整 输入: 3 1+2 2.7/3 1+3*3 输出: 3 0...

奔跑的程序猿 1408

POJ百练-4132:四则运算表达式求值

描述 求一个可以带括号的小学算术四则运算表达式的值 输入 一行,一个四则运算表达式。’*‘表示乘法,’/'表示除法 输出 一行,该表达式的值,保留小数点后面两位 样例输入 输入样例1: 3.4 输入样例2: 7+8.3 输入样例3: 3+4.5*(7+2)*(3)*((3+4)*(2+3.5)/(4+5))-34*(7-(2+3)) 样例输出 输出样例1: 3.40 输出样例2: 15.30 输出样例3: 454.75 参考代码: #include<iostream> #include&lt

阿豪的博客 666

acm_35表达式求值

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。 比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数) 输入 第一行输入一个整数n,共有n组测试数据(n 每组测试数据只有

月光轩辕的专栏 1082

表达式求值

表达式求值时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。 比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数) 输入 第一行输入一个整数n,共有n组测试数据(n<10)。 每组测

李静静 657

POJ 4132 四则运算表达式求值

点击此处返回总目录 该题目有两个版本。 第一个版本是简化了的版本,假设运算符和结果都...

liupc的学习笔记 728
上一篇: 贪心类算法总结
下一篇: 排序算法总结(不断更新中)
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值