编程练习5:后缀表达式的计算(int上计算器)

ios:使用swift完成计算器 关于计算器的实现在做之前想了几个方案。 首先是做一个输入功能,再以后缀表达式来进行计算,但是这个更适用于做一个科学计算器,在平日生活中的计算器需要一些便捷的计算效果。 所以实现这个计算器使用了将数字存入Label然后转化String为Int的方式。 算数符号可以存于一个数组内,以数组自带的编号来表示运算符, 程序内需要储存的数字可以简单的两个,但是只用两个数字以类似 sum1 += sum2的形式... 阅读详情

要求:将输入的一个中缀表达式转换为后缀表达式进行输出,输出后利用后缀表达式计算式子的结果,将结果进行输出。

思路:

中缀转后缀详见编程练习4

这里处理的时候讲所得到的后缀的结果放置在一个vector中,相比较放在stack中更好的进行取数进行运算

这里需要注意的一点是vector为string类型:原因:以为可能出现229  16这样的数字就不能够每一个符号一个符号的进行判断。

在进行运算时需要将vector中用字符串表示的数字转化为int类型这里使用string自带的函数atoi完成转换

#include <iostream>
#include <stack>
#include<string>
#include<vector>
using namespace std;
int main(void)
{
	char a[100];
	cin >> a;
	int length = 0;//用来存储数据的长度
	while (a[length] != '\0')
	{
		length++;
	}
	cout << "数组的长度为 ###" << length << endl;;
	/*接下来对这个数组进行处理,这时会用到一个栈进行处理,同时申请一个新的char型数组
	用来存储最后要打印出来的东西*/
	stack<char>sum;//申请一个栈用来处理符号
	vector<string>result;
	int re1;
	for (int i = 0; i < length; i++)
	{
		cout << "第"<<i<< "次循环" << endl;
		if (a[i] == '+' || a[i] == '-')
		{
			cout << "pandan+/-" << endl;
			//若果为加号或者减号
			if (sum.empty())
			{
				sum.push(a[i]);
			}
			else
			{
				while (!sum.empty() && (sum.top() == '*' || sum.top() == '/' || sum.top() == '+' || sum.top() == '-'))
				{
					string str = "";
					str = str + sum.top();
					result.push_back(str);
				
					sum.pop();
				}
				sum.push(a[i]);
			}

		}
		else if (a[i] == '*' || a[i] == '/')
		{
			cout << "pandaun*//" << endl;
			while (!sum.empty() && (sum.top() == '*' || sum.top() == '/' ))
			{
				string str = "";
				str = str + sum.top();
				result.push_back(str);

				sum.pop();
			}
			sum.push(a[i]);
		}
		else if (a[i] == '(')
		{
			//左括号压入栈中
			sum.push(a[i]);
		}
		else if (a[i] == ')')
		{
			cout << "oandaun)" << endl;
			//右括号弹栈
			while (sum.top() != '(')
			{
				string str = "";
				str = str + sum.top();
				result.push_back(str);
				sum.pop();
			}
			sum.pop();
		}
		else
		{
			cout << "直接输出"<<i << endl;
			string str = "";
			while (a[i] >= '0'&&a[i] <= '9')
			{
				cout << "limian"<<i << endl;
				str = str + a[i];
				i++;
				cout << "这时a[i]为"<<a[i] << endl;
			}
			i--;
			result.push_back(str);
		}
	}
	//将栈中剩下的内容打印出来
	while (!sum.empty())
	{
		string str = "";
		str = str + sum.top();
		result.push_back(str);

		sum.pop();

	}

	for (int k = 0; k <result.size(); k++)
	{
	cout << result[k]<<" ";
	}
	
	//进行计算
	int re = 0;
	stack<int>shuzi;
	for (int p = 0; p < result.size(); p++) 
	{
		if (result[p] != "+" && result[p] != "-" && result[p] 
			!= "*" && result[p] != "/")
		{
			//将数字单独放在一个栈里
			cout << "得到一个数字" << atoi(result[p].c_str()) << endl;;
			shuzi.push(atoi(result[p].c_str()));	
		}
		else if(result[p] == "+")
		{
			int a = shuzi.top();
			shuzi.pop();
			int b = shuzi.top();
			shuzi.pop();
			re = a + b;
			shuzi.push(re);
		}
		else if (result[p] == "-")
		{
			int a = shuzi.top();
			shuzi.pop();
			int b = shuzi.top();
			shuzi.pop();
			re = a - b;
			shuzi.push(re);
		}
		else if (result[p] == "*")
		{
			int a = shuzi.top();
			shuzi.pop();
			int b = shuzi.top();
			shuzi.pop();
			re = a * b;
			shuzi.push(re);
		}
		else if (result[p] == "/")
		{
			int a = shuzi.top();
			shuzi.pop();
			int b = shuzi.top();
			shuzi.pop();
			re = a / b;
			shuzi.push(re);
		}
	}
	cout << "最终结果是" << endl;
	while (!shuzi.empty())
	{
		cout << shuzi.top() << endl;
		shuzi.pop();
	}


	system("pause");
	return 0;
}

本算法可以实现多个括号计算的功能,可以完成一个应用在整型数据上的计算器

利用栈实现逆波兰计算器 逆波兰表达式是是干什么的? 逆波兰表达式又叫做后缀表达式。逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasiewicz)于1929年首先提出的一种表达式的表示方法 。后来,人们就把用这种表示法写出的表达式称作“逆波兰表达式”。逆波兰表达式把运算量写在前面,把算符写在后面。 为什么要使用 逆波兰表达式? 我们在日常生活中接触到的表达式都是中缀表达式,所以中缀表达式对于人来说更加容易理解,但是计算机理解中缀表达式比较困难实现中缀表达式的计算也比较困难,相反后缀表达式在计算机中实现起来更加简单。 利用栈 阅读详情

相关推荐

后缀表达式计算求值实例

由于工作中的需要,自己整理的一个后缀表达式计算求值实例,采用VS2008写的工程,希望对大家有用。

数据结构(练习)——后缀表达式

一、需要自定义的优先级 package com_1.constant; //运算符自定义的优先级 public class Constant { public static final int PRI_ERROR = -1; //栈外左括号 public static final int PRI_LEFT_OUT = 1; //栈内乘 publ...

初叙 1714

计算后缀表达式的值——题目

计算后缀表达式的值 一道很经典的题目。建议做一下

数据结构--后缀表达式一些习题

(56-20)/(4+2)    --&gt;  56#20#-4#2#+/(A+B*C)/D    --&gt;    ABC*+D/A+B*(C-D)-E/F    --&gt;   ABCD-*+EF/-注意:如果给的中缀表达式是纯数字,就需要在数字后面加#,运算符后面不需要。如果给的中缀表达式是字母,就都不需要#。...

FromNowOnUntilTheEnd 3512

Stack练习 中缀-后缀表达式 -

后缀表达式是相当有用处,转换成后缀表达式后求值会简单很多.那么该如何转换?这里告诉你 !

ESP32 TWAI CAN库实战:从零构建CyberGear微电机控制框架

本文详细介绍了如何利用ESP32的TWAI控制器和Arduino环境,从零构建一个面向对象的CyberGear微电机控制框架。该框架将复杂的CAN通信协议封装为简洁的API,开发者无需深究底层细节,即可轻松实现电机的速度、位置和扭矩控制,大幅简化机器人关节、云台等项目的开发流程。

oil88的博客 499

练习:前缀表达式、后缀表达式

求解:前缀表达式、后缀表达式 这里我给出一个中缀表达式:a+b*c-(d+e) 第一步:按照运算符的优先级对所有的运算单位加括号:式子变成了:((a+(b*c))-(d+e)) 第二步:转换前缀与后缀表达式 前缀:把运算符号移动到对应的括号前面 则变成了:-( +(a *(bc)) +(de)) 把括号去掉:-+a*bc+de 前缀式子出现 后缀:把运算符号移动到对应的括号后面 则...

猴子居士的博客 1593

关于海康网络摄像头使用VLC或者Opencv拉流有延迟的问题

先说结论,我用VLC或者Pyhton opencv直接拉取海康网络摄像头的rtsp流,会有1-2s延时,特别明显。环境:Windows + VLC / Openc-Python。如上面文章介绍,我使用的时候遇到一处错误,需要把代码中的。海康SDK:与网页视频相比,几乎是同步的。上面说的延时,也是与摄像头网页视频相比的。ffplay 去掉缓存:延时1s左右。这两处地方改成左斜杠,才能运行。opencv拉流使用的是。多线程:延时1s左右。

yljxh的博客 4500

刷题笔记:后缀表达式及pta习题

目录 一:后缀表达式的定义 二:后缀表示法的“规则” 1,中缀转后缀的方法 2,后缀表达式的计算方法 三,题型训练 1,后缀表达式 2,后缀表达式的计算 四:总结及声明 月下写代码 一:后缀表达式的定义 通常将运算符写在运算量之间,例如a+b,这种表示法称为中缀表示法。后缀表示法又称逆波兰表示法,它是波兰逻辑学家卢卡西维奇发明的一种表示表达式的...

C_Ryson的博客 4602

拆解特斯拉Optimus的关节技术:谐波减速器在仿人机器人中的5个精妙设计

本文深度解析特斯拉Optimus仿人机器人关节中的谐波减速器技术,揭示其五大工程突破:微型化材料革命、两万分之一圈精度实现、碳纤维柔轮轻量化、智能运维系统及国产替代方案。重点探讨谐波减速器如何通过创新设计和先进材料实现精准传动,为仿人机器人提供高效可靠的关节动力解决方案。

omega的博客 1075

Changer: Feature Interaction Is What You Need forChange Detection

还有“交换“交互是一种完全不需要参数和计算的操作,它是通过交换空间或通道维度上的双时态特征映射来实现的,交换的特征在经过后续的卷积或令牌混合时进行混合。方法二:提出了两种简单的交互策略,AD和特征“交换”,大量的实验表明,它们可以极大地提高MetaChanger的性能,特别是特征“交换”,即使嵌入到复杂的网络中或应用于具有挑战性的数据集。在这里,我们用虚线勾勒本文的重点。这是变化检测任务的基本问题,双时相图像提供了同一地区在不同时间点的图像数据,通过对比这两个时间点的图像,我们可以检测出该地区的变化。

yokon的博客 1622

stack_queue 扩展学习 [ 计算器实现 ]

摘要:本文介绍了计算器实现的核心思路,重点解析了中缀表达式转后缀表达式(逆波兰表达式)的算法原理。通过栈结构处理运算符优先级问题,详细阐述了转换规则和运算步骤,包括数字输出、运算符优先级比较、括号处理等关键操作。文章提供了完整的C++代码实现,涵盖中缀转后缀、后缀表达式求值两个主要功能模块,并针对LeetCode题目"基本计算器"给出了特殊处理方案(如空格去除、负数识别)。最后对比了官方简化解法,展示了不同场景下的实现策略。

Small_entreprene的博客 1033

【实战】ESP32 + LN298N 实现电动推杆的闭环位置伺服控制

本文详细介绍了如何使用ESP32微控制器和LN298N电机驱动模块,为普通电动推杆增加编码器反馈,实现精准的闭环位置伺服控制。文章从硬件选型与接线讲起,深入解析了编码器四倍频计数原理与位置换算,并重点阐述了PID控制算法的核心思想、代码实现及参数整定方法,旨在帮助读者从零构建一个反应迅速、定位精准的智能执行器系统。

weixin_29195615的博客 318

MFC计算器实战:从后缀表达式算法到桌面应用开发

表达式求值是计算机科学中的基础算法问题,其核心在于将人类习惯的中缀表达式转换为计算机易于处理的后缀表达式(逆波兰表示法),再通过栈数据结构实现高效求值。这一原理不仅是数据结构与算法课程的核心内容,也是编译器设计、解释器开发等领域的底层技术。在工程实践中,将算法模块与用户界面分离是构建可维护、可测试软件的关键架构思想。通过经典的MFC(Microsoft Foundation Classes)框架,开发者可以深入理解Windows桌面程序的消息驱动模型、文档-视图架构以及资源管理机制。本项目以计算器开发为场景

weixin_34033624的博客 351

人工智能训练师技能等级认定四级技能考核试卷-样题1

本文为人工智能训练师四级技能考核试卷,包含六个实操考核项目,总分100分,考试时间150分钟。试卷涵盖数据处理、模型训练准备及系统维护等核心技能:1)垃圾分类数据集规范与处理(30分),要求评估数据格式并编写Python处理代码;2)学生成绩数据集分析(20分),涉及数据预处理、可视化及相关性分析;3)数据标注审核(10分),重点审核标注准确性;4)智能数据服务系统维护与优化(40分),包括安全帽数据集的项目创建、数据处理及平台协作。考核强调Python编程、数据处理平台操作及AI工作流程的实践能力。

weixin_42221934的博客 440

Google Earth Engine(GEE)——将sentinel - 2影像所有波段重采样到10m分辨率 (resample 和 projection的使用)

影像重投影是将一个影像从一个坐标系投影到另一个坐标系的过程。这通常涉及到将像素从一个平面坐标系变换到另一个平面坐标系。这可以用于许多应用中,例如建立数字高程模型(DEM)和地图制图。影像重投影通常需要进行数学计算,包括转换矩阵和插值算法,以确保像素值的准确性和精度。这次我们将对哨兵2好数据中20m分辨率的波段,重采样到10m分辨率中,然后同一参与计算。

此星光明博客 3108

227. 基本计算器 II

第十个字符 ‘+’,栈顶元素是 ‘*’,此符号小于栈顶元素,栈中元素全部出栈(没有比 + 号更低的优先级,所以全部出栈),并加入后缀表达式,并将当前符号进栈。再从左到右遍历后缀表达式,遇到数字就进栈,遇到符号就将处于栈顶俩个数字出栈运算,运算结果入栈,一直重复,就可以计算出最终结果。第十二个字符 ‘/’,栈顶元素是 ‘+’,若此符号优先级高于栈顶符号(乘除 > 加减),入栈。第九个符号 ‘*’,栈顶元素是 ‘+’,此符号大于栈顶元素,入栈。第三个字符是符号 ‘(’,因为是左括号还没配对,入栈。

Debroon 1193

016、自动标注方案实战:用大模型(SAM/Grounding DINO)生成 YOLO 格式伪标签

本文介绍了一种利用大模型自动生成YOLO格式伪标签的实战方案。针对传统人工标注效率低、易出错的问题,作者提出结合Grounding DINO(零样本检测)和SAM(精细分割)的优势:前者快速生成候选框,后者优化边界精度。文章详细阐述了技术选型理由(平衡速度与精度)、环境搭建避坑指南(关键依赖版本)、核心三步流程(检测-分割-格式转换)以及后处理技巧(置信度分级过滤)。实验表明,该方案相比纯人工标注可节省80%时间,且经过SAM优化的边界框精度提升10-15%。特别强调了工程细节:文本描述格式、阈值设定、小目

zzfmlxs的博客 544

200行代码实现一个简易的计算器

200多行代码写一个能实现加减乘除的计算器 中缀表达式和后缀表达式: 1 + 3 * 5这样的表达式是中缀表达式,是一种日常的表达方法,能够便于理解其运算顺序 其优点是整洁,字面意思便于理解 缺点是需要考虑运算符的优先级 1 3 5 * +这样的表达式是后缀表达式,他可以从中缀表达式转换过来,对于计算机,后缀表达式更方便计算,并且不需要考虑运算符优先级 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的方法为,以一个符号栈来存储符号,一个数组来存储后缀表达式的信息,从前往后扫描表达式的信息,

qq_48201696的博客 1397

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

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

WINCC7.3破解文件

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

中缀表达式计算器

中缀表达式的计算主要要转换为后缀表达式。 例如       中缀表达式->(1+2)*3-4         转换为后缀表达式   12+3*4- 至于后缀表达式的计算就很容易了     设定一个栈,然后后缀表达式从左到右一次进栈,如果当前的入栈的是数字就将其压入栈中, 如果是运算符,就从栈中弹出两个数字进行相应的运算,然后将运算后的数字压回栈中。当字符串完全处理之后,栈顶就是运算结果 P

计科菜鸟的天地. 2308

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

stack的应用----一个简单的整数计算器

stack的应用----一个简单的整数计算器 本例来自课本《c++语言程序设计(第4版)》第9章第9-9的案例 本例实现一个简单的整数计算器,能够进行加、减、乘、除和乘方运算。使用时算式采用后缀输入法,每个操作数、操作符之间都以空白符分隔。例如,若要计算“3+5”则输入“3 5 +”。乘方运算符用“^”表示。每次运算在前次结果基础上进行,若要将前次运算结果清除,可输入“c”。当输入“q”时程序结束...

hummingbird0的博客 862

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

计算器2

#define _CRT_SECURE_NO_WARNINGS 1 #include #include #include #include #define STACK_INIT_MEMORY 10 #define ADD_MEMORY 10 #define SIZE 100; typedef char ElemType; typedef struct stack { Elem

Sunnylunch-blog 1545

用C语言手写一个计算器:从逆波兰表达式到链栈实现的完整流程

本文详细介绍了如何使用C语言从零实现一个计算器程序,重点讲解了逆波兰表达式的原理和链栈的实现方式。通过数据结构中栈的应用,读者可以掌握四则运算的处理方法,提升C语言编程能力。项目涵盖中缀转后缀表达式、链栈设计与实现等核心内容,适合想要深入学习数据结构和算法实践的开发者。

weixin_30740295的博客 414

数据结构与算法: 使用栈解决计算器问题

数据结构与算法:使用栈解决计算器问题 Tips: 采用java语言, 关注博主,底部附有完整代码 使用到的知识点: 栈 中后缀表达式 后缀表达式 中缀表达式转后缀表达式 支持范围: + - * / 小括号() 小数点 例如: 案例一: 20 - 5 + 25 / 5 + 20 / 5 + 100 - 24 - 0.4 案例二: (3 + 5 + 2.5) - 2 * 5 效果图 案例一 案例二 案例二思路分析图: 案例一(不带括号) 注释我写的很详细,直接看完整代码

高级开发者进阶ing... QaQ 654

别再死记硬背了!用Python栈实现中缀表达式求值,5分钟搞定计算器核心逻辑

本文详细介绍了如何使用Python栈实现中缀表达式求值,5分钟掌握计算器核心逻辑。通过栈结构将中缀表达式转换为后缀表达式,并逐步求值,解决了运算符优先级问题。文章包含完整代码实现和优化建议,适合开发者快速掌握表达式求值技术。

weixin_30851867的博客 410

计算后缀表达式

NO COPYING!   NO COPYING! NO COPYING! //Sinhaeng Hhjian //后缀表达式 #include&lt;bits/stdc++.h&gt; #define MAX 100 using namespace std; struct Stack{ double *base; int top; }; void Push(Stack &amp;s,...

Sinhaeng_Hhjian 569
上一篇: 编程练习4:中缀表达式转后缀
下一篇: 编程练习6:最大公约数
coding_diamond
博客等级 码龄8年 8粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值