写一个计算器【后缀表达式】(C++)

news2025/1/12 20:58:36

前言:

闲来无事,

用后缀表达式写了个计算器。。。

支持加(+)、减(-)、乘(*)、除(/)、乘方(^)

啥是后缀表达式:

波兰逻辑学家卢卡西维奇发明的表示表达式的方法

后缀式即逆波兰式,是波兰逻辑学家卢卡西维奇(Lukasiewicz)发明的一种表示表达式的方法。

这种表示方式把运算符写在运算对象的后面,例如,把a+b写成ab+,所以也称为后缀式。这种表示法的优点是根据运算对象和算符的出现次序进行计算,不需要使用括号,也便于用械实现求值。例如:对于表达式(a+b)*(c+d),其后缀式为ab+cd+*

后缀表达式的优势所在

实现逆波兰式的算法,难度并不大,但为什么要将看似简单的中缀表达式转换为复杂的逆波兰式?原因就在于这个简单是相对人类的思维结构来说的,对计算机而言中序表达式是非常复杂的结构。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍采用的内存结构是栈式结构,它执行先进后出的顺序。

后缀表达式运算规则

1.设定运算符栈

2.假设表达式的结束符为"#",我们需要预设运算符栈底元素为"#"

3.扫描表达式,若当前字符是操作数,则直接发送给后缀表达式;

4.若当前字符为运算符且优先级大于栈顶运算符,则进栈,否则退出栈顶运算符并将其发送给后缀      式。然后将当前运算符放入栈中。

5.若当前字符是结束符,则将栈中的全部运算符依次发送给后缀式。

6.若当前字符为"(",进栈。

7.若当前字符为")",则从栈顶起,依次将栈中运算符出栈发送给ie后缀式,直到碰到"("。将栈中          "("出栈,不需要发送给后缀式。然后继续扫描表达式。

举个例子:

 代码实现:

#include<bits/stdc++.h>
#include <windows.h>

using namespace std;

string problem;
int len;

string expr;
stack<char> sym;//符号栈 
stack<int > val;//数字栈 

string cmp(char fir ,char sec)//判断优先级 
{ 
	if(fir=='('&&sec==')') return "DELE";
	if(fir=='('||sec=='(') return "PUSH";
	if(sec==')') return "TODO";
	if(fir=='+'||fir=='-') return (sec=='+'||sec=='-')? "TODO":"PUSH";
	if(fir=='*'||fir=='/') return (sec=='*'||sec=='/'||sec=='+'||sec=='-')? "TODO":"PUSH";
	return "TODO";
}
int  ANS(string prob)
{
	expr="";
	while(sym.size()) sym.pop();
	while(val.size()) val.pop();
	//处理字符串 ,把整个字符串用括号套起来(处理负数,如“-1+1”) 
	expr+="(";
	for(int i=0; i<prob.size(); i++)
	{
		if( (prob[i]=='-'||prob[i]=='+') && (!i||prob[i-1]=='(') ) expr+='0'; 
		if(prob[i]=='('&&prob[i-1]==')') expr+='*';
		expr+=prob[i];
	}
	expr+=")";
	sym.push('(');
	for(int i=1; i<expr.size(); i++)
	{
		int num=0;
		if(isdigit(expr[i]))
		{
			while(isdigit(expr[i])) num=num*10+expr[i]-'0',i++;
			val.push(num);
		}
		while(true)
		{
			string OP=cmp(sym.top(),expr[i]);
			if(OP=="PUSH"){sym.push(expr[i]);break;}
			if(OP=="DELE"){sym.pop();break;}
            if(OP=="TODO")
			{
				int a,b;
				//取出两个数字 
				a=val.top(),val.pop();
				b=val.top(),val.pop();
				//取出一个运算符 
				char op=sym.top();
				sym.pop();
				
				
				if(op=='+') val.push(a+b);
				if(op=='-') val.push(b-a);
				if(op=='*') val.push(a*b);
				if(op=='/') val.push(b/a);
				if(op=='^') val.push(pow(b,a));
			}
		}
	}
	return val.top();
}
signed main()
{
	while(1)
	{
		system("cls");
		cout<<"请输入表达式:\n";
		cin>>problem;
		system("cls");
		cout<<"答案:\n";
	    cout<<problem<<"="<<ANS(problem)<<"\n";
	    system("pause");
	}
	
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/117932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql根据父节点递归查询所有子节点,List转树形结构工具类

经常有业务需要递归查询MySQL树形结构某一节点的所有子节点&#xff0c;每次从网上扒拉找都得找半天&#xff0c;索性就自己总结一些自己遇到的比较好用的一些方法。 SQL方法一&#xff1a; SELECT* FROM(SELECTt1.*,IF( FIND_IN_SET( parent_id, parent_ids ) > 0, paren…

2022年先进封装行业研究报告

第一章 行业概况 封装为半导体产业核心一环&#xff0c;主要目的为保护芯片。半导体封装测试处于晶圆制造过程中的后段部分&#xff0c;在芯片制造完后&#xff0c;将晶圆进行封装测试&#xff0c;将通过测试的晶圆按需求及功能加工得到芯片&#xff0c;属于整个 IC 产业链中技…

Android平台GB28181设备接入端如何实时更新经纬度实现国标平台侧电子地图位置标注

技术背景 我们在做GB28181设备接入端的时候&#xff0c;其中有个功能&#xff0c;不难但非常重要&#xff1a;那就是GB28181实时位置的订阅&#xff08;mobileposition subscribe&#xff09;和上报(notify)。 特别是执法记录仪、智能安全帽、车载终端等场景下&#xff0c;现…

mysql-基础SQL语句CRUD

文章目录MySQL基础1&#xff0c;数据库相关概念1.1 数据库1.2 数据库管理系统1.3 常见的数据库管理系统1.4 SQL2&#xff0c;MySQL2.1 MySQL安装2.1.1 下载2.1.2 安装(解压)2.2 MySQL卸载2.3 MySQL配置2.3.1 添加环境变量2.3.2 新建配置文件2.3.3 初始化MySQL2.3.4 注册MySQL服…

国家涉及身份安全新规解读 | 《关键信息基础设施安全保护要求》

2022 年11 月 7 日&#xff0c;《信息安全技术关键信息基础设施安全保护要求》&#xff08;GB/T39204-2022&#xff09;国家标准发布。作为关键信息基础设施安全保护标准体系的构建基础&#xff0c;该标准将于 2023 年 5 月 1 日正式实施。 该标准提出了以关键业务为核心的整体…

软件测试内容的要点

软件测试内容的要点 20大的召开后&#xff0c;其中提出着力点坚持把发展经济的着力点放在实体经济上&#xff0c;加快建设制造强国、质量强国、航天强国、交通强国、网络强国、数字中国。 随着网络的快速发展&#xff0c;网络和数字已经呈现在大众的视野&#xff0c;软件产品…

2022-12-27 不下载Android Studio直接下载SDK、Platforms-tools、NDK

文章目录全平台支持&#xff01;&#xff01;&#xff01;1. 下载Command line tools only2. 解压command only3. 下载SDK, Platforms-tools, NDK全平台支持&#xff01;&#xff01;&#xff01; 1. 下载Command line tools only 官网链接&#xff1a;https://developer.and…

【电商】FMS财务管理系统---数据流转模块组成

继了解FMS财务管理系统定义之后&#xff0c;如何设计一个FMS系统成了新的问题&#xff0c;笔者在此介绍了FMS的业务逻辑和结构&#xff0c;希望对读者有所帮助。 在此还是要强调一下&#xff0c;虽然这里称之为“财务系统”&#xff0c;但和专业的财务软件有区别&#xff0c;只…

零售收银软件太难挑!实测市面上最受欢迎的收银软件,第一个好用

零售收银软件千千万&#xff0c;常常让商户老板挑得眼花缭乱&#xff0c;不少老板反馈&#xff0c;不知道怎么挑选收银系统软件才能不踩雷。本期小编收集了市场受欢迎度较高的五个零售收银软件&#xff0c;整理了它们各自的优势和劣势&#xff0c;供大家参考。 第一名&#xff…

Appium基础 — APP模拟手势高级操作(一)

APP模拟手势的动作都被封装在TouchAction类中&#xff0c;TouchAction是AppiumDriver的辅助类&#xff0c;主要针对手势操作&#xff0c;如滑动、按、拖动等&#xff0c;原理是将一系列的动作放在一个链条中发送到服务器&#xff0c;服务器接受到该链条后&#xff0c;解析各个动…

碳酸氢锂溶液除钙镁

锂及其盐类是国民经济和国防建设中具有重要意义的战略物资&#xff0c;也是与人们生活息息相关的能源材料。而碳酸锂作为锂盐的基础盐&#xff0c;是制取锂化合物和金属锂的原料&#xff0c;可作铝冶炼的电解浴添加剂&#xff0c;亦可用于合成橡胶、染料、半导体等方面。电池级…

当我把用Python做的课堂点名系统献给各科老师后,再也没挂过科

文章目录起因准备工作效果展示代码实战最后起因 刚上大学的表弟问我&#xff0c;大学准备好好玩玩&#xff0c;问我有没有什么不挂科的秘诀。 哎&#xff0c;这可就问对人了&#xff0c;要想不挂科&#xff0c;先把老师贿赂好&#xff0c;当然&#xff0c;咱们说的贿赂不是送…

全国首个月子中心服务等级划分团体标准的实施拉开月子中心行业新市场格局

11月24日-25日&#xff0c;2022中国母婴业品牌大会暨第七届中国母婴产业高峰论坛在湖南省长沙市盛大召开&#xff0c;来自全国的月子中心、产后修复中心、产康中心、托育机构等近600名业内精英参与了此次盛会。由龙翔集团作为标准编制组长单位&#xff0c;作为整店输出加盟集团…

Arduino - Debugging on the Arduino IDE 2.0

文章目录Arduino - Debugging on the Arduino IDE 2.0概述如果没有官方文档, 如何手工测试哪种开发板能在Arduino IDE 中单步调试?可以调试的板子的调试按钮状态单步调试前下断点ENDArduino - Debugging on the Arduino IDE 2.0 概述 弄了2块开发板(Mega2560(MCU is ATmega2…

浏览器http缓存机制

1、前言 前端缓存主要是分为HTTP缓存和浏览器缓存。其中HTTP缓存是在HTTP请求传输时用到的缓存&#xff0c;主要在服务器代码上设置;而浏览器缓存则主要由前端开发在前端js上进行设置。 http缓存是web缓存的核心&#xff0c;是最难懂的那一部分,也是最重要的那一部分。 2、H…

【大数据clickhouse】clickhouse 数据备份与恢复

一、前言 与其他的数据存储引擎类似&#xff0c;clickhouse承载着大数据量级的数据存储&#xff0c;对于数据的备份与恢复也是必须考虑的&#xff0c;本文将通过操作演示下如何对clickhouse数据进行备份与恢复。 官网说明&#xff1a;官网备份操作说明clickhouse可以通过手动进…

NEMU(RISC-V64)基础知识(一)

目录 1、术语和定义 2、CISC和RISC的区别 3、vimtutor指令查看常见VIM使用命令 4、GDB调试 5、x86中寄存器 6、x86中指令的具体行为 7、中断和异常 8、RISC-V的中断 9、一条指令在NEMU中的执行过程 10、NEMU中的输入输出 11、在NEMU的运行时环境中执行程序步骤 12、…

HarmonyOS使用ArkUI绘制圣诞树

一、前言 起因我参加了 “挑战代码画颗圣诞树” 活动&#xff0c;又因为本次推出一个“圣诞定制勋章”活动&#xff0c;一个是传资源&#xff0c;一个是写文章&#xff0c;为了更好的把知识传递给大家&#xff0c;所以我又出了这篇文章&#xff0c;大家进来一起学习一下吧。 二…

Linux- 系统随你玩之--操作文件和目录

文章目录1、前言2、文件、目录相关的指令2.1、当前所在目录2.2、当前目录所有的文件和目录2.3、切换当前工作目录2.4、 创建目录与文件2.6 、拷贝文件3 、文本查看3.1、cat 查看文件内容3.2、head 查看前n行内容3.3、tail 查询后n行内容4、文本编辑4.1、vi 指令4.2、more 指令4…

华为三层交换机做中继,WinServer2012当DHCP服务器

ENSP桥接一台 Windows Server&#xff0c;当DHCP服务器 1、拓扑图 2、汇聚交换机设置 <Huawei>sys# 关闭消息提示 [Huawei]undo in en[Huawei]sys SW1# 批量创建 VLAN [SW1]vlan batch 10 20 30 100# 设置 VLAN 为 Trunk [SW1]int g0/0/1 [SW1-GigabitEthernet0/0/1]p…