C++表达式求解

通过C++求解中缀表达式 中缀表达式求值 1.概述: 在C++ Primer(5th)的第九章顺序容器中出现了下面一道习题: 作为栈适配器的练习,这个题目看上去很复杂(emmmm。。。刚开始看了好几遍都没太懂题目要干什么)。有些疑惑地我又看了看对应的英文版,意思完全不一样好不好。。。 现在这个题目就很简单了,就是通过栈把被左右圆括号括起来的内容替换掉,没有什么太多需要注意的地方,实现代码如下: #include<... 阅读详情

#include"stack"
#include<string>
using namespace std;

stack<char> Symbol;
stack<double>number;
double Calcul(const string &s);//传表达式进这个函数可以返回运算的值,这里运算只包括加减乘除和括号
void divit()
{
	if (!Symbol.empty())
	{
		if (Symbol.top() == '/')
		{
			Symbol.pop();
			double x = number.top();
			number.pop();
			divit();
			number.push(1.0 / x);
			Symbol.push('*');
		}
	}
}
double Calcul(const string &s)
{
	string str=s;
	
	int flag = 0;
	for (int i = 0; i < (str.length()); i++)
	{
		if (str[i] == (wchar_t)'(')
			flag++;
		if (str[i] == (wchar_t)')')
			flag--;
	}
	if (flag != 0)
	{
		double result = 0.0;
		return result;
	}
	else
	{//100+20*10-55^2
		int strat = 0, end = 0;
		bool ifstart = false;
		for (int i = 0; i < (str.length()); i++)
		{
			double now = 0.0;//记录数字
			double r = 1.0;//基

			if (str[i] == '(' || str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/')
			{
				if (Symbol.empty() == true)
				{
					Symbol.push(str[i]);
				}
				else
				{
					if (str[i] == '+' || str[i] == '-')
					{
						while (!Symbol.empty())
						{
							if ((Symbol.top() == '*' || Symbol.top() == '/'))
							{
								char sym = Symbol.top();
								Symbol.pop();
								double a = 0.0, b = 0.0;
								b = number.top();
								number.pop();
								if (!Symbol.empty())
								{
									if (Symbol.top() == '/')
										divit();
								}
								a = number.top();
								number.pop();
								if (sym == '*')
									a = a*b;
								if (sym == '/')
									a = a / b;
								number.push(a);
							}
							else
								break;
						}
					}
					Symbol.push(str[i]);
				}
			}
			else if (str[i] == ')')
			{
				while (Symbol.top() != '(')
				{
					char sym = Symbol.top();
					Symbol.pop();
					double a, b;
					a = number.top();
					number.pop();
					b = number.top();
					number.pop();
					if (sym == '-')
						number.push(b - a);
					if (sym == '+')
						number.push(b + a);
					if (sym == '*')
						number.push(b*a);
					if (sym == '/')
						number.push(b / a);
				}
				if (Symbol.top() == '(')
					Symbol.pop();
			}
			else if (str[i] >= '0'&&str[i] <= '9' || str[i] == '.')
			{
				if (ifstart == false)
				{
					ifstart = true;
					strat = i;
				}
				if (i == str.length() || ((str[i + 1]<'0' || str[i + 1]>'9') && str[i + 1] != '.'))
				{
					end = i;
					ifstart = false;

					for (int j = end; j >= strat; j--)
					{

						if (str[j] == '.')
						{
							now = now / (r);
							r = 1.0;
						}
						else
						{
							now += r*(str[j] - '0');
							r *= 10.0;
						}
					}
					number.push(now);
				}
			}

		}
	}
	double result = 0.0;
	while (!Symbol.empty())
	{
		double a, b;
		char sym = Symbol.top();
		Symbol.pop();
		b = number.top();
		number.pop();
		a = number.top();
		number.pop();
		if (sym == '+')
		{
			number.push(a + b);
		}
		if (sym == '-')
		{
			number.push(a - b);
		}
		if (sym == '*')
		{
			number.push(a * b);
		}
		if (sym == '/')
		{
			number.push(a / b);
		}
	}
	result = number.top();
	return result;
}


Ubuntu20.04下运行VINS系列:VINS-Mono、VINS-Fusion和GVINS 安装好了VINS-Mono所需的ROS noetic、Eigen3.4.0、Ceres2.10和OpenCV4.2.0等。VINS-Mono是在ROS melodic以及Ceres1的环境下开发的,因此需要适配高版本的环境。 阅读详情

相关推荐

保姆级教程:用YOLOv8n模型在RKNN和Horizon平台完成目标检测(附C++部署代码与性能实测)

本文提供了一份详尽的YOLOv8n模型在RKNN和Horizon平台上的部署指南,涵盖环境配置、模型优化、跨平台适配及性能调优。通过实战案例和C++部署代码,帮助开发者在嵌入式设备上高效实现目标检测,显著提升推理性能。

weixin_42659194的博客 468

C++ Lambda表达式(匿名函数): [](){}

> 匿名函数(英文名:lambda)就是没有名字的函数。 > 最简单的匿名函数是`[](){}`,它没有参数也没有返回值。 > 在匿名函数中,`[]`里面用来**捕获函数外部的变量**,而`()`里面就是匿名函数的**参数**,`{}`里面就是函数的**执行代码**。

Fuguir™的博客 4750

别再为授权费头疼了!手把手教你免授权搞定西门子、马扎克等12种主流数控机床的数据采集

本文提供了一套免授权采集西门子、马扎克等12种主流数控机床数据的实战指南,帮助中小型机加工车间节省80%以上的采集成本。通过TCP/UDP协议逆向工程和跨平台数据整合,实现经济、灵活且可持续的数据采集方案,涵盖设备兼容性处理、数据频率优化等关键问题。

weixin_26873711的博客 707

C++ [](){}

该形式是C++中的lambda函数(匿名函数) 普通函数与lambda函数对比 匿名函数是许多编程语言都支持的概念,有函数体,没有函数名。 函数对象能维护状态,但语法开销大,而函数指针语法开销小,却没法保存范围内的状态。 基本lambda语法 基本形式如下: [capture](parameters)->return-type {body} []叫做捕获说明符,表示一个lambda表达式的开始。接下来是参数列表,即这个匿名的lambda函数的参数,->return...

龍的传人 1万+

【重启后nvidia-smi 命令出现错误】

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

qq_44769377的博客 5211

Silly Tavern酒馆ai角色卡与世界书导入超详细教程!

前几天,我在设置 Silly Tavern 的时候,想导入一个喜欢的角色卡,结果发现不少朋友其实已经下载好了角色资源,但却不知道怎么正确导入使用。这篇文章就作为一份完整的新手向教程,一步步教你如何在 Silly Tavern 中导入角色卡、世界书,并实现与 AI 角色的真实互动。如果你是第一次接触这个功能,建议先收藏慢慢看~点击菜单栏上的 图标,打开角色界面。初始状态下,你应该只看到默认角色 Seraphina。你可以先点击她的头像尝试聊天,也可以导入自己喜欢的角色。点击导入按钮,选择你下载好的角色卡(通

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2万+

C++之重载数组下标[]与圆括号()运算符的方法

重载数组下标运算符"[]":#include &lt;iostream&gt; using namespace std; class Vector { public: Vector(int a1, int a2, int a3, int a4) { m_nGril[0] = a1 ; m_nGril[1] = a2 ; m_nGril[2] = a...

老痒的农舍 9110

Qt/C++编写自定义控件42-开关按钮

一、前言 从2010年进入互联网+智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ、360卫士、金山毒霸等,都有很多开关控制一些操作,在Qt widgets应用项目上,在项目中应用些类似的开关按钮,估计也会为项目增添不少新鲜感。 总结了大部分的开关按钮控件,基本上有两大类,第一类是纯代码绘制,这种对代码的掌控度要求比较高,但是灵活性比较好...

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 3327

【C++】解释C++里面奇怪的[](){}、[xxx]( int a, int b ) { return a + b; }这类写法到底是什么鬼【是著名的lambda啊啊啊啊】

缘由:有几个新手私信我,看到C++里面出现了 [](){ 代码 }这类写法不知所云。 解答:总而言之就是C++11的新特性,Lambda函数。 其实这个lambda函数并不是C++首创的。 解释一下: 1,捕捉列表 捕捉列表总是作为lambda的开始,即出现于lambda的开始处。它是lambda的引出符(即开始标志)。编译器可以根据该“标志”来作出判断出该函数是否为lambda函数...

H_O_W_E的专栏 3624

把 ABAP 接到外部世界的几条路, 从 Web Service 到 RFC、BAPI 与 IDoc 的完整理解

摘要: ABAP 的连接能力是其长期成为企业核心的关键,不仅支持通用协议(HTTP、SOAP、XML),还保留了 SAP 特有的技术(RFC、BAPI、IDoc)。Web Service 是跨系统通信的主轴,依赖 SOAP/WSDL 实现契约化协作,而 Enterprise Service 更强调业务语义的复用与治理。经典技术如 RFC 和 BAPI 因高效稳定仍广泛使用,尤其适合紧耦合场景。ABAP 通过分层工具箱(如代理生成、服务注册)实现灵活集成,平衡新旧技术,满足多样化的企业连接需求。 (字数:15

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 138

C#项目实战——【实例】企业人事管理系统(二):4、数据库与数据表设计;5、创建项目;

(1)展开新建的db_PWMS数据库节点,选中“表”节点,单击鼠标右键,在弹出的快捷菜单中选择“新建表”命令,如下图:(2)在SQL Server 2008管理器的右边显示一个新表,这里输入要创建的表中所需要的字段,并设置主键,如下图:(3)单击“保存”按钮,弹出“选择名称”对话框,如下图,输入要新建的表名“tb_Login”,单击“确定”按钮,即可在数据库中添加一个表。

做有价值的事,积累有价值的笔记! 1621

第十周项目二C/C++用二叉树求解代数表达式

/* *Copyright (c) 2017,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:.cpp *完成日期:2017年11月16日 *版 本 号:v1.0 * 用二叉树求解代数表达式 /* 用二叉树来表示代数表达式,树的每一个分支节点代表一个运算符,每一个叶子节点代表一个运算数(为简化,只支持二目运算的+、-、*、/,不

JING727708672的博客 851

LangGraph-StateGraph 和 Graph API 源码分析

摘要: StateGraph是LangGraph的核心API,用于构建有状态工作流图。本文分析了其实现原理,包括: 核心类关系:StateGraph(构建器)和CompiledStateGraph(继承自Pregel的可执行图) 关键流程:状态模式到通道的映射、节点到PregelNode的转换 实现特点: 支持TypedDict和Pydantic两种状态模式 自动选择通道类型(LastValue或BinaryOperatorAggregate) 通过映射函数处理节点输入输出 边实现基于通道写入机制 编译过程

838

C++中实现表达式的求解

要写一个计算器,如果要进行连续运算,则要将中缀表达式转化为后缀表达式再求解。 步骤: 1) 从中缀表达式中提取每一项、存放到队列中;2) 将中缀表达式转换成后缀表达式;3) 计算后缀表达式的值。 功能:1、+-/*四则运算2、小数运算   先将字符串保存到中缀表达式队列

yillc的专栏 3094

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

表达式求解程序(CPP实现)

对于一个表达式如果只有四种基本运算符,那么是比较容易求解的,只需要简单的处理优先级关系就看可以了。但如果再加上括号运算符会不会使问题变的太复杂呢,毕竟括号的运算特性是修改其他运算符的优先级?在这里采用了一种取巧的方法,将括号运算模拟成一个阶梯,从而使问题又回到了简单的处理优先级关系的时代。

深蓝的专栏 1018

廖雪峰Python教程[完整版]

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

C++实现顺序栈类求解中缀表达式的计算

        控制台第一行打印的数值为使用形如以下方式得到的结果:        cout &lt;&lt; 200+500*(200+300)*600/709-400 &lt;&lt; endl;         即第一个待求解表达式由C++表达式计算所得结果,以用于与实现得出的结果作比较。         第1次测试:         第一个待求解表达式实现得出的结果比由C+...

u25th_engineer的博客 1175

WINCC7.3破解文件

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

C++的逆波兰表达式的求解

逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。逆波兰结构由弗里德里希·鲍尔(Friedrich L. Bauer)和艾兹格·迪科斯彻在1960年代早期提议用于表达式求值,以利用堆栈

shiwazone的专栏 6821

【山西电子科技学院】C/C++算术表达式的求解[2025-12-16]

山西电子科技学院计算机科学与技术学院2025年12月C/C++课程设计任务书摘要:本次设计题目为"算术表达式的求解",要求学生运用C语言结合数据结构知识,采用栈结构实现表达式求值功能。设计要求包括:从键盘输入表达式、使用栈结构求解、表达式正确性判断及错误提示、正确表达式结果输出。设计周期为2025年12月4日至31日,需提交程序源码、可执行文件和课程设计说明书。评分标准包括功能实现(40%)、现场答辩(40%)和课程设计报告(20%)三部分,重点考察算法实现、界面友好性和文档规范性。

code helper 929

C++用栈求解简单的算术表达式

C++用栈求解简单的算术表达式问题描述设计运算算法代码实现1.定义一个Calculator类2.得到运算符优先级3.输入算术表达式4.将中缀表达式转换成后缀表达式5.计算后缀表达式6.主函数 问题描述 这里限定的简单算术表达式求值问题是,用户输入一个包含“+”、“-”、“*”、“/”、正整数和圆括号的合法数学表达式,计算该表达式的运算结果。 设计运算算法 中缀表达式 在算术表达式中,运算符位于两个操作数中间的表达式称为中缀表达式。 例:1 + 2 * 3 中缀表达式运算一般遵循“先乘除,后加减,从左至右,

bobi1024的博客 1831

C++数据结构X篇_11_C++栈的应用-后缀表达式求解

上篇中我们介绍了我们所熟知的中缀表达式转为后缀表达式,那么如何通过呢?本篇将会介绍计算机是如何基于后缀表达式计算的?

分享学习成长历程,Winter is coming! 546

C++ 算术表达式求解

操作数支持:多位数,小数 运算符支持:+ - * / ( ) #include<iostream.h>#include<string.h>#include<stdlib.h> /*栈*/template <class T>class CStack{public:int m_count;T * m_arr;int m_cur...

dongkua7650的博客 404

C++ 求解逆波兰表达式

今天做一个C++题,求解逆波兰表达式,我把我自己坑惨了啊~ 是我C++底子不牢,用了switch,结果case里没用break,就每个case全操作了一遍,最后得出0…… 要用break或者continue啊! #include<bits/stdc++.h> using namespace std; int add(char s[]){ stack<int> num; stack<char> op; int i = 0; while(i

xsybg的博客 612

C++栈的应用——后缀表达式求解

在前面“C++栈的应用——中缀转后缀”我们将我们所熟知的中缀表达式转为后缀表达式,那么如何通过后缀表达式获得原表达式的值呢? 将后缀表达式:“2963/+5-*4+”从左往右逐个字符进行遍历获得操作符,同时建立一个空栈stack。 一、当操作符为数字时,直接入栈。 二、当操作符为运算符时,取栈顶数字做右计算数值并弹出,再取一个栈顶数字做左计算数值并弹出。其与运算符做四则运算,结果入栈。 三、当遍历完成后,从栈中弹出唯一数字,该数字就是这个后缀表达式运算结果。 下面提...

qq_41696018的博客 1564

C++堆栈实现表达式求解

C++堆栈实现表达式求解,要求实现:1、实现堆栈,包括堆栈的生成,压栈,出栈操作。2、用户输入表达式,使用堆栈对表达式进行求解并且输出结果。

m0_62367990的博客 819
上一篇: 标准字符串std::string和System::String, CString之间的转换
下一篇: C++更改文件名
seekforcode
博客等级 码龄12年 9粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值