当前位置: 首页 > web >正文

【数据结构入门训练DAY-18】信息学奥赛一本通T1331-后缀表达式的值

文章目录

  • 前言
  • 一、题目
  • 二、解题思路
  • 总结

前言

本次训练内容:

  1. 栈的复习。
  2. 栈模拟四则运算计算问题的练习。
  3. 训练解题思维。

一、题目

        从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(—)、乘(*)、除(/)四种运算符。每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。以@作为结束标志。比如,16–9*(4+3)转换成后缀表达式为:16□9□4□3□+*–,运行结果:-47。提示:输入字符串长度小于250,参与运算的整数及结果之绝对值均在2^64范围内,如有除法保证能整除。

输入格式

一个后缀表达式。

输出格式

一个后缀表达式的值。

样例输入

16 9 4 3 +*-@

样例输出

-47

二、解题思路

        这道题目是让我们把字符串中的数字存入栈中,然后从后面的‘+-*/’的顺序依次进行计算,出现'@'是结束。我的思路是创建两个栈s,s1和对应的字符串,然后通过定义一个指针i去遍历字符串,把字符串中的数字元素存入s;每当遇到空格时,就先处理位数问题,位数处理就是定义两个变量作为指针给它初始值进行位运算,然后开始压入s1,每次操作一遍后要更新重置对应的两个指针。然后依次判断i指向的运算符是什么,并计算。

#include<bits/stdc++.h>
using namespace std;int main() {stack<char> s;stack<int>s1;//定义两个不同的栈int m=0,n=1;//定义位运算的变量作为指针int a,b;//定义指向运算时要出栈的两个元素的指针string str;getline(cin,str);for (auto i:str) {//智能指针法遍历if (i == '@') {//判断是否为结束符'@'break;}if (i>='0'&&i<='9') {//判断字符串的数字并存入s中s.push(i);}else if (i==' ') {//当到空格符时对栈中的元素进行位运算while (!s.empty()) {m=m+(s.top()-'0')*n;s.pop();n=n*10;}s1.push(m);//位运算结束后压入新栈m=0;n=1;}//对运算符进行对应的运算if (i == '+') {a=s1.top();s1.pop();b=s1.top();s1.pop();s1.push(a+b);}if (i == '-') {a=s1.top();s1.pop();b=s1.top();s1.pop();s1.push(b-a);}if (i == '*') {a=s1.top();s1.pop();b=s1.top();s1.pop();s1.push(a*b);}if (i == '/') {a=s1.top();s1.pop();b=s1.top();s1.pop();s1.push(b/a);}}cout<<s1.top()<<endl;//计算最终结果
}

        因为题目的数据有正负和运算顺序的要求,所以需要保证进行减法和除法运算时,对应的变量位置书写正确。

总结

        今天的题目是一道经典的栈的操作复习题,今天的题目结束后,明天最后写一道进阶题,栈的复习题就全部完成了,栈的作用还是挺重要,运用的范围还是挺广的,所以练习的时间比较长,如昨天总结的括号匹配问题和今天的后缀表达式问题都是栈的学习中十分经典的问题,希望后面写到类似的问题都能快速解答。

http://www.xdnf.cn/news/590.html

相关文章:

  • URLDNS链构造
  • Android Studio 中 Drawable 详细全解
  • Android Drawable 目录下的 XML 图形文件详解
  • 在 Linux 上部署 .NET Core 应用并配置为开机自动启动
  • [操作系统] 信号
  • GO语言入门:常用数学函数2
  • rollup使用讲解
  • JUC复习及面试题学习
  • SpringBoot 统一功能处理
  • 智谱开源新一代GLM模型,全面布局AI智能体生态
  • 墙面刷完乳胶漆之后就有裂缝,有根治的办法吗?
  • Java面向对象进阶
  • BEVDet: High-Performance Multi-Camera 3D Object Detection in Bird-Eye-View
  • 年化26.9%的稳健策略|polars重构因子计算引擎(python策略下载)
  • AI——神经网络以及TensorFlow使用
  • 《汽车理论》第四章作业MATLAB部分
  • 传统深度学习架构和Transformer结构的区别
  • 从0开始搭建一套工具函数库,发布npm,支持commonjs模块es模块和script引入使用
  • uniapp-商城-29-vuex 关于系统状态的管理
  • 嵌入式单片机开发问题:Undefined symbol _HAL_RCC_GPIOB_CLK_ENABLE
  • Matlab 基于模型参考自适应法和SVPWM的异步电机控制
  • Kubernetes(k8s)学习笔记(二)--k8s 集群安装
  • 机器学习(神经网络基础篇)——个人理解篇6(概念+代码)
  • 【实战中提升自己】内网安全部署之dot1x部署 本地与集成AD域的主流方式(附带MAC认证)
  • UE5的BumpOffset节点
  • C++选择排序原理及实现
  • Python带有else子句的循环语句
  • 动态内存管理
  • [dp20_完全背包] 介绍 | 零钱兑换
  • PSN港服跳过生日找回密码(需要英语对话,需要注册的id)