简单计算器的实现

思路:

1.记录输入的中缀表达式(运算符在中间,我们正常写的式子)
2.将中缀表达式——>后缀表达式
由左到右遍历中缀表达式,若是数字,用数组或队列记录(记录后缀表达式);若是符号,与操作符栈中的栈顶元素比较优先级,如果遍历的操作符优先级>栈顶元素,将操作符入栈,否则将栈顶元素出栈到用数组或队列中(记录后缀表达式);
遍历完最后将栈中剩余的操作符全部出栈到用数组或队列中(记录后缀表达式);
3.计算后缀表达式
由左到右遍历表达式,若是操作数,压入栈中;若是操作符,连续弹出两个操作数,再将计算得到的结果压入栈中。
直至扫描完毕,栈顶元素即为最终计算结果,返回栈顶元素即可。

#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <map>
using namespace std;
struct node{double n;//操作数,记flag=truechar m;//操作符,记flag=falsebool flag;//记录输入是操作数还是操作符
}temp;
string str;//记录输入内容(中缀表达式)
queue<node> q;//记录后缀表达式
stack<node> s;//记录操作符
map<char,int> prior;//设置操作符的优先级void change(){//将str中的中缀表达式转化成了q中的后缀表达式for(int i=0;i<str.length();){if(str[i]>='0'&&str[i]<='9'){//是操作数temp.flag=true;temp.n=str[i++]-'0';while(i<str.length()&&str[i]>='0'&&str[i]<='9')//下一位仍然是操作数temp.n=temp.n*10+(str[i++]-'0');//求和再放入q.push(temp);//放入后缀表达式中}else{temp.flag=false;//栈中有操作符,才能与栈顶元素比较优先级while(!s.empty()&&prior[str[i]]<=prior[s.top().m]){//栈顶元素优先级高q.push(s.top());//放入后缀表达式中s.pop();//出栈}temp.m=str[i];s.push(temp);//入栈i++;}}while(!s.empty())//还有操作符{q.push(s.top());s.pop();//直至全部出栈}
}double calculate(){//计算后缀表达式的计算结果double operate1=0,operate2=0;node result;while(!q.empty()){temp=q.front();q.pop();//装入就出队if(temp.flag)  s.push(temp);//是数字就入栈else{//是操作符,输出两个数进行计算operate1=s.top().n;//输出第一个操作数s.pop();operate2=s.top().n;//输出第二个操作数s.pop();result.flag=true;//记录计算结果if(temp.m=='+') result.n=operate2+operate1;else if(temp.m=='-') result.n=operate2-operate1;else if(temp.m=='*') result.n=operate2*operate1;else if(temp.m=='/') result.n=operate2*1.0/operate1;s.push(result);}}return s.top().n;
}
int main(){//设置优先级prior['+']=prior['-']=1;prior['*']=prior['/']=2;//优先算cin>>str;change();//转化为后缀表达式cout<<calculate()<<endl;while(!s.empty()) s.pop();//清空栈return 0;
}

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

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

相关文章

SVN服务备份

hotcopy备份 window批处理 保存以下内容到svn_buckup.bat&#xff0c;确保内容的路径正确&#xff0c;最后双击bat文件进行备份即可 echo offrem SVN安装路径 set svn"C:\Program Files\VisualSVN Server\bin"rem 仓库根目录 set homeE:\Repositories\WorkSpacere…

vue2的ElementUI的form表单报错“Error: [ElementForm]unpected width”修复

1. 问题 ElementUI的form表单&#xff0c;当动态切换显示表单时报错 Error: [ElementForm]unpected width。 翻译过来就是form表单的label宽度width出了问题。 2. 分析 参数说明类型可选值默认值label-width表单域标签的宽度&#xff0c;例如 ‘50px’。作为 Form 直接子元…

【Simulink系列】——动态系统仿真 之 连续系统线性连续系统

声明&#xff1a;本系列博客参考有关专业书籍&#xff0c;截图均为自己实操&#xff0c;仅供交流学习&#xff01; 一、连续系统定义 连续系统输出在时间上连续变化&#xff0c;而非间隔采样取值&#xff0c;满足以下条件&#xff1a; ①输出连续变化&#xff0c;变化的间隔…

OpenAI 的 Sora AI 视频生成器太疯狂了

毫不夸张地说&#xff0c;当我第一次看到 Sora 生成的前几个视频时&#xff0c;我的下巴都惊掉了。 Sora是什么&#xff1f; Sora 是一种人工智能模型&#xff0c;可以根据简单的文本提示生成视频。它能够生成一分钟的高保真视频。 Sora 是一种扩散模型&#xff0c;一种先进的…

阿赵UE学习笔记——15、灯光的移动性概念和构建光照信息

阿赵UE学习笔记目录   大家好&#xff0c;我是阿赵。   继续学习虚幻引擎&#xff0c;这次来学习一下UE里面灯光的移动性概念和构建光照信息。 1、灯光移动性 打开一个带有灯光的场景 在大纲面板里面找到其中一个灯光&#xff1a; 会发现灯光的细节面板里面&#xff0c;…

智慧环卫建设方案

三、软件工程的总体构架 3.1框架构建基准 3.2框架设计 四、业务应用层主要功能模块 4.1数据字典管理模块 数据字典主要包含有&#xff08;GIS&#xff09;地理信息管理系统、信息安全管理系统、平台接口管理系统等三个方面的管理应用&#xff1b; 1).&#xff08;GIS&#…

「Python系列」Python字典

文章目录 一、Python字典创建字典访问字典中的元素修改字典删除字典中的元素遍历字典字典推导式 二、Python字典内置函数&方法内置函数字典方法 三、Python简介四、相关链接 一、Python字典 在Python中&#xff0c;字典&#xff08;dict&#xff09;是一个无序的键值对集合…

springboot/ssmHome F家居系统Java家居商城购物管理系统

springboot/ssmHome F家居系统Java家居商城购物管理系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&…

package.json文件详解

packages.json文件里面配置的属性的含义 name和version 以上两个是最重要的两个属性&#xff0c;否则模块无法被安装&#xff0c;一起形成了它的唯一标识符 模版中内容变化&#xff0c;版本也要随之一起变化 description 描述&#xff0c;方便别人理解模块作用 main 程序…

3、windows环境下vscode开发c/c++环境配置(二)

前言&#xff1a;上一篇文章写了windows环境下&#xff0c;配置vscode的c/c开发环境&#xff0c;这一篇讲vscode开发c/c的配置文件&#xff0c;包括c_cpp_propertues.json&#xff0c;task.json及launch.json。 一、总体流程 通过c/c插件我们就可以来编写c/c程序了&#xff0c…

【ArcGIS微课1000例】0104:二位面状数据转三维多面体(建筑物按高度拉伸)

文章目录 一、加载数据二、添加高度字段三、三维拉伸显示四、生成三维体数据五、注意事项一、加载数据 打开ArcScene,加载配套实验数据(0104.rar中的二维建筑物矢量数据,订阅专栏,获取专栏所有文章阅读权限及配套数据),如下图所示: 二、添加高度字段 本实验将二维数据…

3、电源管理入门之CPU热插拔详解

目录 简介 1. 省电技术概览 (1)、cpu hotplug和idle的区别? 2. 热插拔代码介绍 (1)、为什么以cpu1为例? 3. ATF中处理 简介 之前介绍了电源的开机和关机重启,本小节开始介绍省电的技术,其中最暴力的省电方法就是直接拔核hotplug处理,就像需要…

什么是 Wake-on-LAN?如何使用 Splashtop 远程喊醒电脑

在当今数字互联的世界里&#xff0c;远程访问电脑已不仅仅是一种便利&#xff0c;而是许多人的需要。无论是远程工作、IT 支持&#xff0c;还是管理整个网络中的计算机群&#xff0c;我们都必须掌握正确的工具和技术。 其中一项在远程访问中发挥关键作用的技术是 Wake-on-LAN …

带你了解SMTP,POP3,IMAP协议

电子邮件&#xff08;email&#xff09;是一种电子通信方式&#xff0c;可以通过网络传输文本、图像、音频和视频等信息。在发送和接收电子邮件时&#xff0c;需要使用一种称为“邮件协议”的标准化协议。常用的电子邮件协议有SMTP、POP3和IMAP。 SMTP&#xff08;Simple Mail…

【LeetCode周赛】第 384 场周赛

目录 3033. 修改矩阵 简单3034. 匹配模式数组的子数组数目 I 中等3035. 回文字符串的最大数量 中等3036. 匹配模式数组的子数组数目 II 困难 3033. 修改矩阵 简单 3033. 修改矩阵 分析&#xff1a; 获取每一列的最大元素&#xff0c;将矩阵中的 -1 替换成每一列的最大元素。 …

java开源xml工具类介绍

在Java中处理XML的常用开源工具有很多&#xff0c;以下是一些流行的库以及简单的示例代码&#xff1a; DOM4J DOM4J 是一个非常流行的Java库&#xff0c;用于处理XML&#xff0c;DOM4J 易于使用&#xff0c;并且提供了很好的性能。 Maven 依赖 …

游戏物理引擎+特效系统

原文链接&#xff1a;游戏开发入门&#xff08;六&#xff09;游戏物理引擎_游戏开发物理引擎-CSDN博客 游戏开发入门&#xff08;七&#xff09;特效系统_csdn 游戏效果开发-CSDN博客 1.游戏应用物理的目的就是为了真实 2.物理引擎&#xff1a; 可以认为属于游戏引擎的一个…

挑战杯 基于LSTM的天气预测 - 时间序列预测

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 机器学习大数据分析项目 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/po…

Stable Diffusion——基础模型、VAE、LORA、Embedding各个模型的介绍与使用方法

前言 Stable Diffusion&#xff08;稳定扩散&#xff09;是一种生成模型&#xff0c;基于扩散过程来生成高质量的图像。它通过一个渐进过程&#xff0c;从一个简单的噪声开始&#xff0c;逐步转变成目标图像&#xff0c;生成高保真度的图像。这个模型的基础版本是基于扩散过程…

论文精读--word2vec

word2vec从大量文本语料中以无监督方式学习语义知识&#xff0c;是用来生成词向量的工具 把文本分散嵌入到另一个离散空间&#xff0c;称作分布式表示&#xff0c;又称为词嵌入&#xff08;word embedding&#xff09;或词向量 Abstract We propose two novel model architec…