4.线性数据结构——3.栈及例题

标准库的栈

  • 定义:stack<typename> myStack;
  • 大小:size()
  • 压栈:push()
  • 弹栈:pop()
  • 栈顶:top()
  • 判空:empty()
#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;int main() {stack<int> myStack;printf("%d\n",myStack.size());for (int i = 0; i < 10; ++i) {myStack.push(i);}printf("%d\n",myStack.size());while(!myStack.empty()){printf("%d\n",myStack.top());myStack.pop();}printf("stack is empty.");return 0;
}

例题

在这里插入图片描述
【提交地址】

分析

int:4byte
unsigned:4byte
long long:8byte
unsigned long long:8byte

代码

#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;int main() {stack<long long> myStack;int n;scanf("%d",&n);for (int i = 0; i < n; ++i) {long long temp;scanf("%lld",&temp);myStack.push(temp);}while(!myStack.empty()){printf("%lld ",myStack.top());myStack.pop();}return 0;
}

括号匹配

在这里插入图片描述

#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;int main() {char buf[200];while(fgets(buf,200,stdin) != NULL){string str = buf;str.pop_back();//去掉额外的换行stack<unsigned> indexStack;//存储左圆括号下标string res;//保存输出结果for (unsigned i = 0; i < str.size(); ++i) {if (str[i]=='('){indexStack.push(i);res.push_back('$');} else if(str[i]==')'){if (indexStack.empty()){res.push_back('?');} else{res.push_back(' ');res[indexStack.top()]=' ';indexStack.pop();}}else{res.push_back(' ');}}printf("%s\n%s\n",str.c_str(),res.c_str());}return 0;
}

计算器

在这里插入图片描述
【提交地址】

思路

  • 使用map,表示各运算符之间的优先级,以便后续的比较
  • 维护两个栈,一个double类型的数据栈,一个char类型的运算符栈
  • 输入控制,输入使用fgets存入一个char数组中,然后定义一个字符串formula接收数组中存的算式,字符串使用pop_back()排除末尾的换行符
  • 接下来根据表达式的长度,对字符串formula从左往右进行遍历:
    • 如果输入的是数字,设置一个字符串num接收
    • 如果输入的是空格,如果num非空,表明空格前是刚输入的数字,需要把num的内容转化成double类型数据,压入数据栈中,然后将num值置为空;如果num已经为空,表明空格前输入的是运算符,不需要操作
    • 其他的情形:
      • 输入的是终结符’$',结尾之前若num非空,,那么将num的数据转为double压入数据栈,运算符压入运算符栈中
      • 输入的是运算符
        • 如果之前运算符栈为空,那么压入运算符栈中
        • 如果之前运算符栈非空
          • 如果当前运算符优先级大于栈顶运算符优先级,那么压入运算符栈中
          • 如果当前运算符优先级小于栈顶运算符优先级,从运算符栈弹出栈顶运算符,依次弹出数据栈栈顶两个数据,第一个弹出的作为右运算符,第二个弹出的作为左运算符,然后计算得到值压入数据栈中;最后运算符压入运算符栈中
  • 结束,输出结果

代码

#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;int main() {char form[1000];map<char,int> priority={{'$',0},{'+',1},{'-',1},{'*',2},{'/',2},};while(fgets(form,1000,stdin) != NULL){string formula = form;formula.pop_back();if (formula == "0"){break;}formula.push_back('$');//补充一个虚拟终止符string num;//用来收集单独的数字以组成一个数字stack<double> number;stack<char> option;for (unsigned i = 0; i < formula.size(); ++i) {if (formula[i]>='0'&&formula[i]<='9'){num.push_back(formula[i]);}else if(formula[i]==' '){if (num != ""){number.push(stod(num));//stod=>string to doublenum="";}}else{if (formula[i]=='$'){if (num != ""){number.push(stod(num));//stod=>string to doublenum="";}}while(!option.empty()&&priority[option.top()]>=priority[formula[i]]){//新来的运算符优先级不高于栈顶的优先级char oper = option.top();option.pop();double rhs = number.top();number.pop();double lhs = number.top();number.pop();switch (oper) {case '+':number.push(lhs+rhs);break;case '-':number.push(lhs-rhs);break;case '*':number.push(lhs*rhs);break;case '/':number.push(lhs/rhs);break;}}//比expr[i]优先级更高的运算都计算过了option.push(formula[i]);}}printf("%.2lf",number.top());}return 0;
}

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

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

相关文章

HarmonyOS NEXT应用开发之搜索页一镜到底案例

介绍 本示例介绍使用bindContentCover、transition、animateTo实现一镜到底转场动画&#xff0c;常用于首页搜索框点击进入搜索页场景。 效果图预览 使用说明 点击首页搜索框跳转到搜索页面显式一镜到底转场动画 实现思路 通过点击首页搜索框改变bindContentCover全屏模态…

大数据面试题 —— HBase

目录 什么是HBase简述HBase 的数据模型HBase 的读写流程HBase 在写的过程中的region的split的时机HBase 和 HDFS 各自的使用场景HBase 的存储结构HBase 中的热现象&#xff08;数据倾斜&#xff09;是怎么产生的&#xff0c;以及解决办法有哪些HBase rowkey的设计原则HBase 的列…

[Qt学习笔记]QGraphicsView实现背景的绘制和前景图像的绘制

1、介绍 Qt中使用QGraphicsScene重写drawBackGround绘制背景&#xff0c;就是使用自定义的Scene类来重写drawBackGround的函数来重新绘制背景&#xff0c;这里需要注意的是自定义的Scene类要继承QGraphicsScene类&#xff0c;因为drawBackGround是一个虚函数&#xff0c;相当于…

【鸿蒙系统】 ---Harmony 鸿蒙编译构建指导(一)

&#x1f48c; 所属专栏&#xff1a;【鸿蒙系统】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢…

【python】爬取杭州市二手房销售数据做数据分析【附源码】

一、背景 在数据分析和市场调研中&#xff0c;获取房地产数据是至关重要的一环。本文介绍了如何利用 Python 中的 requests、lxml 库以及 pandas 库&#xff0c;结合 XPath 解析网页信息&#xff0c;实现对链家网二手房销售数据的爬取&#xff0c;并将数据导出为 Excel 文件的过…

服务器端(Debian 12)配置jupyter与R 语言的融合

融合前&#xff1a; 服务器端Debian 12,域名&#xff1a;www.leyuxy.online 1.安装r-base #apt install r-base 2.进入R并安装IRkernel #R >install.packages(“IRkernel”) 3.通过jupyter notebook的Terminal执行&#xff1a; R >IRkernel::installspec() 报错 解决办…

Qt笔记 信号和槽

在Qt中&#xff0c;如何将两个对象进行关联&#xff0c;让一个对象发出信号&#xff0c;然后另外一个对象接收到信号后&#xff0c;执行该对象的一个方法&#xff0c;要实现这种方式&#xff0c;则需要使用到信号和槽机制。 信号&#xff1a; 信号一定是一个没有返回值的函数…

【CSS练习】万年历 html+css+js

效果图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title><style>bod…

Linux之线程同步

目录 一、问题引入 二、实现线程同步的方案——条件变量 1、常用接口&#xff1a; 2、使用示例 一、问题引入 我们再次看看上次讲到的多线程抢票的代码&#xff1a;这次我们让一个线程抢完票之后不去做任何事。 #include <iostream> #include <unistd.h> #inc…

【NLP笔记】Transformer

文章目录 基本架构EmbeddingEncoderself-attentionMulti-Attention残差连接LayerNorm DecoderMask&Cross Attention线性层&softmax损失函数 论文链接&#xff1a; Attention Is All You Need 参考文章&#xff1a; 【NLP】《Attention Is All You Need》的阅读笔记 一…

【C语言】结构体类型名、变量名以及typedef

文章目录 分类判断结构体成员的使用typedef 分类判断 struct tag {char m;int i; }p;假设定义了上面这一个结构体&#xff0c;tag 就是类型名&#xff0c; p 就是变量名&#xff0c; m 和 i 就是结构体成员列表。 可以这么记&#xff0c;括号前面的是类型名&#xff0c;括号后…

内存条@电脑支持的最大内存@升级内存硬件

文章目录 电脑支持的最大内存规格cpu官网查看支持的规格命令行查看脚本化 DDR内存LPDDR内存内存升级扩展&#x1f47a;插槽检查板载内存SPD内存厂商其他 内存参数&#x1f47a;性能指标使用软件查看更多内存相关的软件工具 电脑支持的最大内存规格 确认电脑最大支持内存大小和频…

在Ubuntu20.04(原为cuda12.0, gcc9.几版本和g++9.几版本)下先安装cuda9.0后再配置gcc-5环境

因为自己对Linux相关操作不是很熟悉&#xff0c;所以因为之前的代码报错之后决定要安cuda9.0&#xff0c;于是先安装了cuda9.0。里面用到的一些链接&#xff0c;链接文件夹时直接去copy它的路径&#xff0c;就不那么容易错了。 今天运行程序之后发现gcc环境不太匹配cuda9.0&am…

图解CodeWhisperer的安装使用

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 &#x1f4d8; CodeWhisperer简介 &#…

原生html vue3使用element plus 的树tree上移下移案例源码

上效果 html源码 <!DOCTYPE html> <html lang"en"> <!-- * Name: mallSalesReports.html * Description: * Author Lani * date 2024-02-28 18:32:36 --> <head><meta charset"UTF-8"><meta name"viewport" …

[uni-app] uni.createAnimation动画在APP端无效问题记录

文章目录 uni.createAnimation动画描述动画代码templatejs部分 问题原因改进方案template js部分改动git 改进截图 uni.createAnimation 动画描述 实现一个以左上角为锚点,以Z轴做平面抬起及落下的动画效果 动画代码 template <image v-if"showHot(item.cname)&quo…

wayland(xdg_wm_base) + egl + opengles 使用 Assimp 加载带光照信息的材质文件Mtl 实现光照贴图的最简实例(十七)

文章目录 前言一、3d 立方体 model 属性相关文件1. cube1.obj2. cube1.Mtl3. 纹理图片 cordeBouee4.jpg二、实现光照贴图的效果1. 依赖库和头文件1.1 assimp1.2 stb_image.h2. egl_wayland_obj_cube1.cpp3. Matrix.h 和 Matrix.cpp4. xdg-shell-client-protocol.h 和 xdg-shell…

GitHub gpg体验

文档 实践 生成新 GPG 密钥 gpg --full-generate-key查看本地GPG列表 gpg --list-keys关联GPG公钥与Github账户 gpg --armor --export {key_id}GPG私钥对Git commit进行签名 git config --local user.signingkey {key_id} # git config --global user.signingkey {key_id} git…

ASPICE规范之系统追溯矩阵

系统追溯矩阵的需求来自 ISO26262 举例在描述系统追溯矩阵时&#xff1a;客户需求->系统需求&#xff1b;系统需求->客户需求&#xff1b;系统需求->软件需求&#xff1b;系统需求->硬件需求

(简单成功)Mac:命令设置别名

案例&#xff1a;给"ls -l"命令&#xff0c;设置别名通过”ll“快速访问 1、在项目根目录底下查看有无.bash_profile文件&#xff0c;注意这个是个隐藏文件&#xff0c;需要使用ls -a命令查看&#xff1a; 没有.bash_profile新建一个文件&#xff0c; 在最后添加一行…