编程练习4:中缀表达式转后缀

栈实现简单计算器(中缀表达式) 目录 一、需求一 思路分析 代码实现 二、需求二 思路分析 代码实现 三、总结 一、需求一 A:要求输入的是中缀表达式,如1+2*3-10/5; B:要求输入运算符只有加、减、乘、除; C:返回中缀表达式的结果; 思路分析 A:定义两个栈对象,一个用于存放表达式中的数据,一个用于存放表达式中的符号; B:中缀表达式以字符串... 阅读详情

后缀表达式又称为逆波兰式,在进行转换后可以不考虑符号的运算顺序或者括号的出现,在栈中若遇到一个符号,则将他最近的两个操作数做计算处理即可。

中缀转后缀的算法思想:

(这里假定用户输入的中缀表达式都是正确的)

根据输入,若为操作数则直接将其输出,若为操作符则需要进行判断一个压栈处理:

若为+  /  -号,在压栈之前,现将<= 他的优先级的运算符号输出

若为*  /  / 号,则直接将其压栈

若无( 号,直接压栈

若为 ) 号,则弹栈,弹到栈顶为(号为止。

程序代码主要为:
 

#include <iostream>
#include <stack>
using namespace std;
int main(void) 
{
	/*char a[100];
	cin >> a;
	cout << "输出a:" << a;
	system("PAUSE");
	//经测试可以直接利用数组进行存储,即便并不能够存储不是开的数组大小都可以完成
	*/
	//将用户的输入进行存储
	//这里是基于用户的输入是正确的
	/*{
		用户的输入可能的存在情况:
			第一个字符就为一个操作符
			括号并不匹配
	}*/
	char a[100];
	cin >> a;
	int length = 0;//用来存储数据的长度
	while (a[length] != '\0') 
	{
		length++;
	}
	cout << "数组的长度为 ###" << length << endl;;
	/*接下来对这个数组进行处理,这时会用到一个栈进行处理,同时申请一个新的char型数组
	用来存储最后要打印出来的东西*/
	char result[100];//用来保存结果
	int f = 0;//永安里标志结果数组的位置
	stack<char>sum;//申请一个栈用来处理符号
	for(int i = 0;i < length;i++)
	{
		if (a[i] == '+' || a[i] == '-') 
		{
			//若果为加号或者减号
			if (sum.empty()) 
			{
				sum.push(a[i]);
			}
			else 
			{
				while (!sum.empty() &&(sum.top() == '*' || sum.top() == '/'|| sum.top() == '+' || sum.top() == '-'))
				{
					result[f] = sum.top();
					sum.pop();
					f++;
				}
				sum.push(a[i]);
			}

		}
		else if(a[i] == '*'||a[i] == '/')
		{
			while (!sum.empty() && (sum.top() == '*' || sum.top() == '/' ))
			{
				result[f] = sum.top();
				sum.pop();
				f++;
			}
			sum.push(a[i]);
			
		}
		else if(a[i] == '(')
		{
			//左括号压入栈中
			sum.push(a[i]);
		}
		else if (a[i] == ')') 
		{
			//右括号弹栈
			while (sum.top() != '(') 
			{
				result[f] = sum.top();
				sum.pop();
				f++;
			}
			sum.pop();
		}
		else 
		{
			result[f] = a[i];//直接输出
			f++;
 		}
	}
	//将栈中剩下的内容打印出来
	while (!sum.empty())
	{
		result[f] = sum.top();
		sum.pop();
		f++;
	}
	for (int k = 0; k <= f; k++) 
	{
		cout << result[k];
	}

	

	system("pause");
	return 0;
}

C++ 中缀表达式转后缀表达式 一、思路:和中缀表达式的计算类似,只不过不用计算,把表达式输出即可       1.用字符数组存储整行输入的中缀表达式;       2.接着从字符数组的0位置开始判断字符,如果是数字,那就要判断后面是否是数字,如果是就不断扫描组成一个整数         (暂不考虑负数和小数),最终组成一个整数,然后输出这个数(因为不用计算,所以直接输出即可);       3.如果是左括号,直接进符号... 阅读详情

相关推荐

C++实现中缀表达式转后缀表达式并求值

中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。例如:(3 + 4) × 5 - 6 就是中缀表

wanna_wsl的博客 4972

中缀表达式转后缀表达式(逆波兰式)

中缀表达式转后缀表达式(逆波兰式)

qq_33300585的博客 6907

「Java 数据结构和算法」:图文详解---中缀表达式转后缀表达式。_中缀表达式转后缀表达式流程图

栈是⼀个先⼊后出的有序列表。栈(stack)是限制线性表中元素的插⼊和删除只能在线性表的同⼀端进⾏的⼀种特殊线性表。允许插⼊和删除的⼀端,为变化的⼀端,称为栈顶(Top),另⼀端为固定的⼀端,称为栈底(Bottom)。根据栈的定义可知,最先放⼊栈中元素在栈底,最后放⼊的元素在栈顶,⽽删除元素刚好相反,最后放⼊的元素最先删除,最先放⼊的元素最后删除。

2401_84185951的博客 1269

中缀表达式转换为后缀表达式

一、为什么要用后缀表达式求值 将中缀表达式转换成等价的后缀表达式后,求值时,不需要再考虑运算符的优先级,只需从左到右扫描一遍后缀表达式即可 二、后缀表达式求值 后缀表达式也叫做逆波兰表达式,其求值过程可以用栈来辅助存储。假定待求值的表达式为 1 2 3 + 4 * + 5 - 它具有如下的几个步骤 (1)遍历表达式 遇到的数字首先放入栈中,此时栈如下所示 (2)接着读到了+ 号,则弹出了3和2 ...

ZhuPengWei_ 1万+

栈应用 : 中缀表达式转后缀表达式求值

中缀表达式 (或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。与前缀表达式(例:+ 3 4)或后缀表达式(例:3 4 +)相比,中缀表达式不容易被计算机解析,但仍被许多程序语言使用,因为它符合人们的普遍用法。 确实,中缀表达式很符合人类的思想,但是让计算机理解起来却不那么容易,这里我们引进了后缀表达式 后缀表达式(也成为逆波兰表达式) 一个表达式E的后缀形式可以如下定义: (1)如果E是一个变量或常量,则E的后缀

m0_46281615的博客 807

C++实现中缀表达式转后缀求值的详细指南

函数内部将通过以下步骤完成转换:1. 初始化一个栈用于存储运算符,同时准备一个字符串用于存放后缀表达式结果。2. 从左至右扫描中缀表达式中的每个字符。3. 遇到操作数时,直接将其添加到后缀表达式字符串中。4. 遇到运算符时,根据运算符优先级与栈顶运算符进行比较,进行相应的入栈、出栈操作,直至运算符可以入栈。5. 表达式扫描结束后,处理栈中剩余的运算符,将其逐一弹出并添加到后缀表达式字符串中。

weixin_32925455的博客 1150

Everydayjava 中缀表达式/后缀表达式

【样例说明2】输入整数N=3,要求整数1、2、3的所有全排列, 共有N!且先输出1开头的所有排列数,再输出2开头的所有排列数,最后输出3开头的所有排列数。【问题描述】编写一个程序,把由单个数字的整数组成的一般的中缀表达式(假定键入的是一个正确的表达式)转化成一个后缀表达式。【样例说明3】输入整数N=10,要求整数1、2、3、4、5、6、7、8、9、10的所有全排列。【问题描述】输入整数N( 1

m0_73814009的博客 147

DevExpress学习之GridControl导入导出至EXCEL

导出: private void EXCELout_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Title = "导出Excel"; saveFileDialog.Filter = "Excel文件(*.xls)|*.xls";

I Can -Jiang 2754

计算中缀表达式

“计算中缀表达式”可以称得上是一个特别经典的关于栈的算法题,几乎在所有数据结构教材中都会涉及,而且很多公司面试或者笔试的时候都会把这道题作为一个考察点。可以说,这是一道必须要掌握的算法题。中缀表达式、后缀表达式等概念在这里就不赘述了,让我们直奔主题。题目:输入一个中缀表达式,计算其结果。输入的前提假设:(1)只考虑+、-、*、/这四种运算符,中缀表达式中只有一种括号:();(2)输入的中缀表达式中...

凛冬烈焰的博客 7862

手把手教你用若依WMS搭建企业级仓库管理系统(Vue+Spring Boot实战)

本文提供了一份基于若依框架(RuoYi)快速搭建企业级仓库管理系统(WMS)的实战指南。详细介绍了从环境准备、项目初始化到核心功能模块(如入库流程、库存管理看板)深度定制的全过程,并涵盖Lodop打印集成、移动端PWA适配及生产环境Docker部署等高级主题,帮助开发者高效构建稳定可用的WMS系统。

weixin_29015899的博客 564

三维旋转详细解读(Rodrigues‘ Roatation Formula 罗德里格旋转公式)

三维旋转引言三维旋转1)欧拉角2)轴角式旋转分解1)V||的旋转2)V⊥的旋转3)V的整体旋转 引言 前面我们了解了 复数在二维旋转中的作用与联系 而四元数与三维旋转之间的关系与复数对二维旋转有很多类似的地方,下面我们就先来详细了解一下三维旋转的过程。 三维旋转 首先讨论一下三维旋转,我们了解到常用的三维旋转有两种方式: 1)欧拉角 即按照一定的顺序,分别对X, Y, Z三个轴进行旋转 θ 角。绕各旋转轴的旋转矩阵为: 然后任意的三维旋转可以分解成上述三种旋转方式的组合。(注意:三个旋转的顺序是非常重要的

晓晨的博客 1万+

中缀表达式转后缀表达式的方法

表达式求值: 1.从左到右进行遍历 2.运算数,直接输出. 3.左括号,直接压入堆栈,(括号是最高优先级,无需比较)(入栈后优先级降到最低,确保其他符号正常入栈) 4.右括号,(意味着括号已结束)不断弹出栈顶运算符并输出直到遇到左括号(弹出但不输出) 5.运算符,将该运算符与栈顶运算符进行比较, 如果优先级高于栈顶运算符则压入堆栈(该部分运算还不能进行), 如果优先级低于等于栈顶运算符则将栈顶运算符弹出并输出,然后比较新的栈顶运算符. (低于弹出意味着前面部分可以运算,先输出的一定是高优先级运算符,等于弹出

wujing1_1的博客 11万+

告别全局搜索!7种SRP-PHAT快速算法实战对比:哪个更适合你的麦克风阵列?

本文深入探讨了7种SRP-PHAT改进算法在声源定位领域的实战表现,包括SRC、CFRC、SPF等方案。通过对比计算效率、定位精度和环境鲁棒性等核心指标,为不同场景(如会议室、智能家居、工业机器人)提供算法选型建议,帮助工程师优化麦克风阵列性能。

weixin_42546392的博客 397

中缀表达式转后缀表达式(栈)

这里给出中缀表达式转后缀表达式的算法过程,以及再举两个例子 算法过程: 1. 数字直接加入后缀表达式 2.如果是‘(’, 入栈 3.如果是‘)’, 则依次把栈中的运算符加入后缀表达式,直到出现‘(’并从栈中删除它 4. 如果是运算符 + - * / a.栈空或者栈顶元素为‘(’, 入栈 b.高于栈顶元素优先级,入栈 c.否则依次弹出栈顶运算符,直到遇到一个优先级小于它的运算符或者是遇到‘(’为止 5.遍历完成后,如果栈非空则依次弹出所有栈顶元素加入到表达式当中 例1: ...

成龙大侠的博客 1万+

地震勘探原理---地震预处理

3.1 为什么说要对数据进行振幅补偿?具体来说,地震波在传播过程中会遇到各种各样的地质条件,例如不同的岩层、土壤、水层等,这些介质的密度、速度等特性不同,因而对地震波的能量消耗也有所不同。在传播距离较远的情况下,能量损失可能会导致接收到的地震信号振幅变小。相反,在传播距离较近的情况下,能量损失可能较小,导致接收到的地震信号振幅变大。如果不对数据进行振幅补偿,这种振幅不均衡会导致地震数据分析和解释的误差和不确定性增加,可能产生错误的结论。

DARRENANJIAN的博客 3274

影刀RPA:轻松搞定Excel表格自动化操作

影刀RPA是一款功能强大的自动化工具,通过模拟人类操作实现各种重复性任务的自动化。零代码操作:通过拖拽式流程设计器,无需编程基础即可快速上手。功能丰富:提供丰富的组件库,涵盖文件操作、数据处理等多种功能。高效稳定:支持多任务并行,确保任务的高效执行和稳定性。支持Python语法:内置数据表格,支持Python语法,对新手友好,同时具备循环功能。通过影刀RPA,您可以轻松实现Excel表格的拆分、列数据合并和归档工作的自动化。这不仅节省了手动操作的时间,还能确保数据处理的高效和准确,提升工作效率和管理水平。

watwrmoon的博客 2560

中缀表达式 & 后缀表达式

一、什么是中缀表达式 &amp;amp;amp; 后缀表达式? 中缀表达式: 我们生活中使用的算术表达式其实就是中缀表达式 举个例子:(1+6/3)*6 - 5 后缀表达式: 更有利于计算机进行计算的一种表达式,不再包含括号(),也不再考虑运算符优先级,一律从左到右进行计算 举个例子: 1 2 + 二、怎么将中缀表达式转换成后缀表达式呢? 利用栈结构来实现中缀表达式 -&amp;amp;gt; 后缀表达式 转换规则:...

itis666的博客 8773

【100%通过率】2023华为od机试C卷【电脑病毒感染】C语言 实现

一个局域网内有很多台电脑,分别标注为 0 ~ N-1 的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t 表示。其中网络内一台电脑被病毒感染,求其感染网络内所有的电脑最少需要多长时间。如果最后有电脑不会感染,则返回-1.

MISAYAONE的博客 1042

利用栈实现:中缀表达式转后缀表达式

题目:现有中缀表达式如:1+(2-3)*4+10/5 请用栈的特性编写一个程序,使得程序输出后缀表达式 分析如下: STEP1: 1+(2-3)*4+10/5 首先遇到第一个输入是数字1,数字在后缀表达式中都是直接输出,接着是符号“+”,入栈: STEP2: 1+(2-3)*4+10/5 第三个字符是“(”,依然是符号,入栈,接着是数字2,输出,然后是符号“-”,入栈: ST...

HaLosec_Wei 3万+

Isaac Sim 入门教程(四)强化学习策略训练宇树人形机器人四足机器人示例

isaac_sim_policy_example Extension 是在 Isaac Sim 中部署 Isaac Lab 强化学习策略的一个框架和一组辅助函数。有关在 Isaac Sim 中训练和构建策略的详细信息,请访问在 Isaac Sim 中部署策略。该扩展程序默认已启用。如果被禁用,可在扩展管理器中搜索 isaacsim.robot.policy.example 重新启用。要运行下面的示例,请激活 “视窗”>“示例”>“机器人示例”,这将打开 “机器人示例 ”选项卡。

机器人控制与仿真应用 3926

精雕软件(JDpaint) 5.5 绿色版

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

问题 M: 中缀表达式转后缀表达式

问题 M: 中缀表达式转后缀表达式 题目表述: 输入一个中缀表达式,编程输出其后缀表达式,要求输出的后缀表达式的运算次序与输入的中缀表达式的运算次序相一致。为简单起见,假设输入的中缀表达式由+(加)、-(减)、×(乘)、/(除)四个运算符号以及左右圆括号和英文字母组成,其中算术运算符遵守先乘除后加减的运算规则。假设输入的中缀表达式长度不超过300个字符,且都是正确的,即没有语法错误,并且凡出现括号其内部一定有表达式,即内部至少有一个运算符号。 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出(添加到

qq_46342449的博客 1973

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

前缀表达式、中缀表达式、后缀表达式的区别

一、三者的概念(参考维基百科)1.1中缀表达式中缀表达式是符合人类直觉的一种表达方式,其特点是操作符(二元操作符)在中间,操作数在两侧。例如 3 + 4 ,   5 - 6 * 7,     (5 - 6) *7等。括号的存在会影响计算步骤的执行。1.2前缀表达式(又称波兰表达式)前缀表达式(以及后缀表达式)是符合计算机思维的一种表达方式。将1.1的几个中缀表达式转换成前缀表达式如下:+ 3 4 ...

sinat_39282526的博客 1万+

VC中sqlite的使用

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

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

中缀表达式转后缀表达式

题目描述 输入一个中缀表达式,编程输出其后缀表达式,要求输出的后缀表达式的运算次序与输入的中缀表达式的运算次序相一致。为简单起见,假设输入的中缀表达式由+(加)、-(减)、×(乘)、/(除)四个运算符号以及左右圆括号和英文字母组成,其中算术运算符遵守先乘除后加减的运算规则。假设输入的中缀表达式长度不超过300个字符,且都是正确的,即没有语法错误,并且凡出现括号其内部一定有表达式,即内部至少有一个运...

weixin_43540427的博客 848

后缀表达式的运算 以及 最详细的中缀表达式转为后缀表达式

第一种是按照上面的方法,将它完完整整地化为中缀表达式后,进行计算;第二种是......

qq_56870066的博客 4267

【数据结构】中缀表达式转后缀表达式

思路一、初始化两个栈:运算符栈 s1 和 储存中间结果的栈 s2;二、从左至右扫描中缀表达式三、遇到操作数时,将其压入 s2四、遇到运算符时,比较其与 s1 栈顶运算符的优先级1.如果 s1 为空,或栈顶运算符为左括号 “( ” ,则直接将此运算符入栈2.否则,若优先级比栈顶运算符的高,也将运算符压入 s13.否则,将 s1 栈顶的运算符弹出并压到 s2 中,再次转到(四、1.)与 s1 中新的栈顶运算符相比较五、遇到括号时:1.如果是左括号 “( ” ,则直接压入 s1。

2302_78914800的博客 2639
上一篇: servlet基础知识学习
下一篇: 编程练习5:后缀表达式的计算(int上计算器)
coding_diamond
博客等级 码龄8年 8粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值