使用栈求表达式的值【数据结构】

中缀表达式转后缀表达式

转换流程:

  • 初始化一个运算符栈
  • 自左向右扫描中缀表达式,当扫描到操作数时直接连接到后缀表达式上。
  • 当扫描到操作符时,和运算符栈栈顶的操作符进行比较。如果比栈顶运算符高,则入栈。如果比栈顶运算符低或等于,则把栈顶的运算符出栈后连接到后缀表达式上。
  • 若运算符是右括号,栈顶是左括号时,删除栈顶运算符(清除括号。后缀表达式中是没有括号的,操作数后面的运算符的优先级由左向右降低)。
  • 重复以上过程直到遇到结束符。

求解后缀表达式

后缀表达式的求解流程:

  • 创建一个栈。
  • 把后缀表达式当成一个字符串,对字符串进行逐字符扫描。
  • 遇到操作数入栈,遇到运算符则从栈中取出 2 个操作数,运算后把结果压入栈。
  • 重复上述过程,直到扫描结束。则栈中的值为最终结果。

E. DS堆栈–表达式计算

题目描述

计算一个表达式的运算结果

使用C++自带stack堆栈对象来实现

参考课本的算法伪代码P53-54

例如

  1. Push (OPTR, ‘#’);表示把字符#压入堆栈OPTR中,转换成c++代码就是OPTR.push(‘#’);
  2. Pop(OPND, a); 表示弹出栈OPND的栈顶元素,并把栈顶元素放入变量a中。因此改成c++代码是两个操作:
    a = OPND.top(); OPND.pop();
  3. a = GetTop(OPND)表示获取栈OPND的栈顶元素,转成c++代码就是: a = OPND.top();

输入
第一个输入t,表示有t个实例
第二行起,每行输入一个表达式,每个表达式末尾带#表示结束

输入t行

输出

每行输出一个表达式的计算结果,计算结果用浮点数(含4位小数)的格式表示

用cout控制浮点数输出的小数位数,需要增加一个库文件,并使用fixed和setprecision函数,代码如下:

#include
#include
using namespace std;
int main()
{ double temp = 12.34
cout<<fixed<<setprecision(4)<<temp<<endl;
}
输出结果为12.3400

输入样例1
2
1+2*3-4/5#
(66+(((11+22)*2-33)/3+6)*2)-45.6789#

输出样例1
6.2000
54.3211

#include<iostream>
#include<string>
#include<stack>
#include<vector>
using namespace std;
int main()
{int t;cin >> t;for (int i = 0; i < t; i++){string s;//记录后缀表达式vector<string> v;	cin >> s;int idx = 0;stack<string> sta;//转为后缀表达式while (idx<s.size()){int f=idx;//处理小数while((s[idx] >= '0' && s[idx] <= '9')||s[idx]=='.') idx++;if(idx!=f) v.push_back(s.substr(f,idx-f));if (s[idx] == '+' || s[idx] == '-'){if (sta.empty()){sta.push(s.substr(idx,1));idx++;continue;}if (sta.top() == "("){sta.push(s.substr(idx,1));idx++;continue;}while ((!sta.empty()) && (sta.top() == "+" || sta.top() == "-" || sta.top() == "*" || sta.top() == "/")){v.push_back(sta.top());sta.pop();}sta.push(s.substr(idx,1));idx++;}else if (s[idx] == '*' || s[idx] == '/'){if (sta.empty()){sta.push(s.substr(idx,1));idx++;continue;}if (sta.top() == "("|| sta.top() == "+" || sta.top() == "-"){sta.push(s.substr(idx,1));idx++;continue;}while ((!sta.empty()) && (sta.top() == "*" || sta.top() == "/")){v.push_back(sta.top());sta.pop();}sta.push(s.substr(idx,1));idx++;}else if (s[idx] == '('){sta.push(s.substr(idx,1));idx++;continue;}else if (s[idx] == ')'){while (sta.top() != "("){v.push_back(sta.top());sta.pop();}sta.pop();idx++;}//结束符else if (s[idx] == '#'){while (!sta.empty()){v.push_back(sta.top());sta.pop();}idx++;break;}}//后缀表达式的数值栈stack<float> two;for (int j = 0; j < v.size(); j++){if (v[j]!="+"&&v[j]!="-"&&v[j]!="*"&&v[j]!="/"&&v[j]!="#") two.push(stof(v[j]));else{float d1 = two.top();two.pop();float d2 = two.top();two.pop();if (v[j] == "+"){two.push(d1 + d2);}else if (v[j] == "-"){two.push(d2 - d1);}else if (v[j] == "*"){two.push(d2*d1);}else if (v[j] == "/"){two.push(d2 / d1);}}}printf("%.4f\n", two.top());}return 0;
}

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

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

相关文章

nvm 的安装及使用 (Node版本管理器)

目录 1、nvm 介绍 2、nvm安装 3、nvm 使用 4、node官网可以查看node和npm对应版本 5、nvm安装指定版本node 6、安装cli脚手架 1、nvm 介绍 NVM 全称 node.js version management &#xff0c;专门针对 node 版本进行管理的工具&#xff0c;通过它可以安装和切换不同版本的…

React使用 useImperativeHandle 自定义暴露给父组件的实例方法(包括依赖)

关键词 React useImperativeHandle 摘要 useImperativeHandle 是 React 提供的一个自定义 Hook&#xff0c;用于在函数组件中显式地暴露给父组件特定实例的方法。本文将介绍 useImperativeHandle 的基本用法、常见应用场景&#xff0c;以及如何处理其依赖项&#xff0c;以帮…

JavaScript函数表达式

JavaScript函数表达式是一种将函数赋值给变量的方式。函数表达式可以以匿名形式或具名形式存在。 匿名函数表达式&#xff1a; var func function() {// 函数的逻辑 }在上面的例子中&#xff0c;将一个匿名函数赋值给变量func。 具名函数表达式&#xff1a; var func fun…

数据链路层解读

基本介绍 概述 数据链路层使用的信道主要有两种类型 点对点信道。使用一对一的点对点通信方式的信道。广播信道。使用一对多的广播通信方式的信道。由于广播信道上连接的主机很多&#xff0c;必须使用专用的共享信道协议来协调这些主机的数据发送&#xff0c;因此通信过程比较…

【Windows】共享文件夹拍照还原防火墙设置(入站,出站设置)---图文并茂详细讲解

目录 一 共享文件夹(两种形式) 1.1 普通共享与高级共享区别 1.2 使用 二 拍照还原 2.1 是什么 2.2 使用 三 防火墙设置&#xff08;入栈&#xff0c;出站设置&#xff09; 3.1 引入 3.2 入站出站设置 3.2.1入站出站含义 3.3入站设置 3.4安装jdk 3.5使用tomcat进行访…

sql_lab之sqli中的堆叠型注入(less-38)

堆叠注入&#xff08;less-38&#xff09; 1.判断注入类型 http://127.0.0.3/less-38/?id1 and 12 -- s 没有回显 http://127.0.0.3/less-38/?id1 and 11 -- s 有回显 则说明是单字节’注入 2.查询字段数 http://127.0.0.3/less-38/?id1 order by 4 -- s 报错 http:/…

python统计一段话中出现每个字的次数

要统计文本中每个字的出现的次数,可以使用Python中的字典来存储每个字及其出现的次数。以下是一个简单的示例代码: text = "这是一个示例文本,用于统计每个字的个数。"# 统计每个字的个数 word_count = {} for word in text:if word in word_count:word_count[wo…

智能优化算法应用:基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工兔算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工兔算法4.实验参数设定5.算法结果6.参考文…

10吨中小学实验污水处理设备排放标准

诸城市鑫淼环保小编带大家了解一下10吨中小学实验污水处理设备排放标准 由于这部分污水比较特殊&#xff0c;我公司专门为此设计一套牙科诊污水处理设备。此设备占地面积小、无噪音、处理效果好、维护简单达标等优点。使口腔诊的污水消毒处理中的预处理和消毒同时进行并达标排放…

键盘快捷键

键盘快捷键 撤销&#xff1a;Ctrl Z 重做&#xff1a;Ctrl Y 加粗&#xff1a;Ctrl/Command B 斜体&#xff1a;Ctrl/Command I 查找&#xff1a;Ctrl/Command F 替换&#xff1a;Ctrl/Command G 关闭当前窗口&#xff1a;AltF4 快速切换到桌面&#xff1a;win D 或 wi…

取证工具volatility插件版学习记录

更新时间&#xff1a;2023年12月18日11:48:29 1. 背景描述 在以前学习过volatility的基础功能&#xff0c;主要是使用volatility独立版进行学习的&#xff0c;前几天遇到一个ctf赛事&#xff0c;需要用到的是volatility的mimikatz模块&#xff0c;因为以前没使用过那个模块&…

6.2 Input事件类型详解

一,Keyboard事件 键盘事件可以与文本输入、导航、选择或特殊键(即具有特殊功能的键,例如音量增/减键)的使用有关。 在处理键盘事件时,应用程序关心的属性包括: 1.1 SCREEN_PROPERTY_SYM 按键被按下时产生的输出。参考sys/keycodes.h。 1.2 SCREEN_PROPERTY_FLAGS 表…

【Filament】立方体贴图(6张图)

1 前言 本文通过一个立方体贴图的例子&#xff0c;讲解三维纹理贴图&#xff08;子网格贴图&#xff09;的应用&#xff0c;案例中使用 6 张不同的图片给立方体贴图&#xff0c;图片如下。 读者如果对 Filament 不太熟悉&#xff0c;请回顾以下内容。 Filament环境搭建绘制三角…

HTML制作暴雨特效

🎀效果展示 🎀代码展示 <body> <!-- partial:index.partial.html --> <canvas id="canvas-club">

python消费rabbitmq

队列经常用&#xff0c;能保持信息一致性。也能跨语言&#xff0c;java写的生产者&#xff0c;推到队列中&#xff0c;python写的消费者消费。 这里&#xff0c;生成者&#xff0c;我们是java&#xff0c;已经发了一条消息了。 python是使用pika来链接rabbitmq 安装pika pip…

爬虫工作量由小到大的思维转变---<Scrapy异常的存放小探讨>

前言: 异常很正常,调试异常/日志异常/错误异常~ 但在爬虫的时候,写完代码--->运行后根本挡不住一些运行异常;于是,把异常写到了中间件~ 当然,这也没有错; 不过,其实可以直接这么设计一下... 正文: 参照一下中间件处理的异常 def process_exception(self, request, exc…

扩展mybatis-plus,保留逻辑删、逻辑查的前提下,扩展硬删除、硬查询

引入相关依赖 <!-- 提示&#xff1a;1. common-mybatis-plus:2100.8.8 中只有4个类文件&#xff0c;是对硬删除、硬查询的扩展支持&#xff0c;如果你不想引入依赖的话&#xff0c;你可以把这四个文件复制到自己的项目中即可2. common-mybatis-plus:2100.8.8 对应mybatis-p…

青少年CTF-qsnctf-Web-include01include02(多种方法-知识点较多-建议收藏!)

PHP常见伪协议 php://filter是PHP中独有的一种协议&#xff0c;它是一种过滤器&#xff0c;可以作为一个中间流来过滤其他的数据流。通常使用该协议来读取或者写入部分数据&#xff0c;且在读取和写入之前对数据进行一些过滤&#xff0c;例如base64编码处理&#xff0c;rot13处…

Unity 渲染顺序受哪些影响(相机depth、SortingLayer、Render Queue、透明)

目录 相机深度&#xff08;Camera Depth&#xff09; Clear Flags 多相机渲染不同部分 SortingLayer 先后顺序 Render Queue Render Queue的作用 Render Queue的分类 GeometryLast&#xff08;值为2500&#xff09; 渲染顺序总结 相机深度&#xff08;Camera Depth&am…

MongoDB ReplicaSet 部署

文章目录 前言1. 环境准备2. 生成密钥3. 配置参数4. 创建 ReplicaSet5. 副本集维护5.1 新增成员5.2 移除节点5.4 主节点降级5.5 阻止选举5.6 允许副本节点读5.7 延迟观测 6. 连接副本集 后记 前言 本篇文章介绍 MongoDB ReplicaSet 如何搭建&#xff0c;及常用的维护方法。 1…