数据结构01 栈及其相关问题讲解

栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为“栈顶”,相应的另一端称为“栈底”。

 

栈及其特点

用一个简单的例子来说,栈就像一个放乒乓球的圆筒,底部是封住的,如果你想拿出乒乓球,只能从顶部拿。同样的,如果你想再将乒乓球放回去,也只能从顶部放入其中。当然生活中还有很多这样的例子,再比如食堂中的一叠盘子,我们只能从顶端一个一个的取。放盘子也只能放在最上方。

总结栈的特点为:先入后出(Last In First Out->LIFO),即先入栈的元素要在之后入栈的元素取出来之后才能取出来。

STL模板中栈的基本使用

对于栈的使用,我们可以直接利用STL模板来实现,STL模板库中栈的基本操作如下:

 头文件:#include<堆栈>

创建一个存放int类型数据的空栈s:stack<int> s;

s.empty():  判断栈是否为空,为空返回true,否则返回false;

s.size():  返回栈中元素的个数;

s.top():  获取栈顶元素的值;

s.push(k):   向栈中添加新的元素k;

s.pop():    删除栈s的栈顶元素。

s.push(k):   向栈中添加新的元素k;

s.pop():    删除栈s的栈顶元素。

 

训练:逆波兰表达式

逆波兰表达式,又称后缀表达式,后缀表达式不包含括号,运算符(包括'+''-''*''/')放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。利用栈结构,将后缀表达式的结果计算出。

【输入描述】输入一个逆波兰表达式,字符之间用空格隔开

【输出描述】输出算式结果

【输入样例】2 1 + 3 *

【输出样例】9

 

参考程序

#include<iostream>
#include<stack>
using namespace std;
int main(){int t,k;char c;stack<int> s;while(cin>>c){if(c>='0'&&c<='9')s.push(c-'0');  //是数字就入栈if(c=='+'){t=s.top(); //获取栈顶数字s.pop();   //出栈k=s.top(); //获取新的栈顶s.pop();     //出栈s.push(t+k);   //相加的和入栈}if(c=='-'){t=s.top();   //获取栈顶s.pop();     //出栈k=s.top();  //获取新的栈顶s.pop();     //出栈s.push(k-t); //相减结果入栈,注意顺序}if(c=='*'){t=s.top();s.pop();k=s.top();s.pop();s.push(t*k);   //相乘的积入栈}if(c=='/'){t=s.top();s.pop();k=s.top();s.pop();s.push(k/t); //相除结果入栈注意顺序}}cout<<s.top();return 0;
}

训练:括号匹配

给定一个字符串,里边可能包含“()”、“[]”、“{}”三种括号,请编写程序检查该字符串的括号是否匹配出现,匹配说明嵌套关系正确,例如 {[()]}() 是匹配的,而)({)[}]( 则不匹配。匹配则输出YES,否则输出NO。)

【输入描述】输入一个字符串 例如(1+2)/(0.5+1)

【输出描述】如果字符串匹配则输出YES,否则输出NO

【输入样例】(1+2)/[(0.5+1)*2]

【输出样例】YES

参考程序

#include <iostream>
#include <stack>
using namespace std;
int main(){stack<char> s;string a;cin>>a;for(int i=0;i<a.size();i++){if(a[i]=='('||a[i]=='['||a[i]=='{')  s.push(a[i]); //左括号入栈if(a[i]==')'){if(s.empty()) //右括号没匹配的就no{cout<<"NO"<<endl;return 0;}if(s.top()=='(')s.pop(); //右括号有匹配的则出栈}if(a[i]==']'){if(s.empty()) //右括号没匹配的就no{cout<<"NO"<<endl;return 0;}if(s.top()=='[') s.pop(); //右括号有匹配的则出栈}if(a[i]=='}'){if(s.empty()) //右括号没匹配的就no{cout<<"NO"<<endl;return 0;}if(s.top()=='{') s.pop(); //右括号有匹配的则出栈}}if(s.empty()) cout<<"YES"<<endl;else cout<<"NO"<<endl;return 0;
}

从入门到算法,再到数据结构,查看全部文章请点击此处icon-default.png?t=N7T8http://www.bigbigli.com/

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

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

相关文章

【简单介绍下Sass,什么是Sass?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Linux:多线程的操作

多线程操作 进程与线程线程的创建 create_pthread创建线程池给线程传入对象的指针 线程等待 pthread_join退出线程 pthread_exit线程等待参数 retval 与 线程退出参数 retval 线程中断 pthread_cancel获取线程编号 pthread_self线程分离 pthread_detach 进程与线程 进程是资源…

史上最全,呕心沥血总结oracle推进SCN方法(八)

作者介绍&#xff1a;老苏&#xff0c;10余年DBA工作运维经验&#xff0c;擅长Oracle、MySQL、PG数据库运维&#xff08;如安装迁移&#xff0c;性能优化、故障应急处理等&#xff09; 公众号&#xff1a;老苏畅谈运维 欢迎关注本人公众号&#xff0c;更多精彩与您分享。前面介…

17-C语言中的变量生命周期——自动存储期、青苔存储期、自定义存储期

17-C语言中的变量生命周期——自动存储期、青苔存储期、自定义存储期 文章目录 17-C语言中的变量生命周期——自动存储期、青苔存储期、自定义存储期一、自动存储期示例 二、静态存储期2.1 示例 三、自定义存储期3.1 如何申请内存3.2 如何释放内存3.3 如何清空内存3.4 示例 概念…

salesforce保存记录后,根据条件弹出对话框提示

首先创建一个Visualforce页面并添加到页面布局。 Visualforce页面 条件语句&#xff1a; 在Visualforce页面的条件语句中&#xff0c;您需要使用正确的Visualforce表达式语法来插入JavaScript代码。此外&#xff0c;Visualforce的表达式语法不支持JavaScript直接调用&#xff…

Redis面试题(个人总结)

1、Redis特点 1、Redis是一个高性能且基于内存的数据库&#xff0c;所有的数据形式都是以键值对的方式来存储的 2、Redis支持丰富的数据类型&#xff0c;例如string,list,set,sorted set,hash&#xff0c;这些类型指的是键值对中的值的类型 3、Redis支持持久化 4、Redis单线程…

MQTT通讯协议接入

1.MQTT协议概述 MQTT是一种基于发布/订阅模式的轻量级消息传输协议&#xff0c;常用于低带宽、不可靠网络环境下传输消息&#xff0c;适用于物联网设备之间的通信。 1.1 MQTT协议的组件 客户端&#xff08;Client&#xff09;&#xff1a;连接到MQTT代理服务器的设备&#xff…

触摸芯片在物联网和人工智能上的应用

在科技更新换代频繁的时代&#xff0c;触摸芯片作为一种重要的人机交互技术&#xff0c;已经在逐渐融入我们的生活。为我们带来了更加便捷、直观的电子产品操作体验&#xff0c;让人与机器之间的沟通变得更加自然流畅。今天我们就来说一说触摸芯片。 触摸芯片的核心是电容感应…

dijkstra 算法为什么高效?

Dijkstra算法的高效性主要体现在其解决有权图中最短路径问题时所采用的方法和策略上。以下是对Dijkstra算法高效性的详细解释&#xff1a; 贪心策略&#xff1a; Dijkstra算法基于贪心原理&#xff0c;在每一步中总是选择具有最小暂定距离的节点。这种策略保证了算法首先探索一…

计算机组成原理(六)

0x12345678和12345678H都是指同一个十六进制,也就是12345678&#xff0c;不过是不同的编程语言的写法而已 具体来说&#xff0c;如果有 n 根地址线&#xff0c;计算机可以寻址的内存空间大小是 2^n 字节。 24根地址线&#xff1a; 如果一个系统有24根地址线&#xff0c;意味着它…

Codeforces Round 952 (Div. 4)

题解写到博客园了&#xff0c;懒得复制过来了了&#xff0c;放个链接 https://www.cnblogs.com/yxcblogs/p/18243276 推广一下自己记录的算法编程竞赛模板仓库 GitHub - yxc-s/programming-template: This repository contains C programming templates optimized for competi…

汇编程序设计之 位操作指令、顺序程序设计

文章目录 位操作类指令逻辑运算指令NOTORANDXORTEST 移位指令逻辑移位算数移位循环移位指令 处理机控制类指令顺序结构程序设计概念例子 位操作类指令 逻辑运算指令 NOT OR 对于每一个位&#xff0c;有1即为1 AND 同时为1才是1 XOR 不相同才为1 TEST 和and 一样的功能&…

postman接口测试工具详解

Postman是一款非常流行的API开发和测试工具&#xff0c;它不仅适用于测试人员&#xff0c;也广泛被开发者使用。Postman提供了全面的功能&#xff0c;能够帮助用户构建、测试、修改和监控API。以下是关于Postman接口测试工具的一些关键功能和使用步骤的详解&#xff1a; 功能概…

RK3568技术笔记六 新建 Ubuntu Linux 虚拟机

VMware 安装完成后&#xff0c;启动 VMware 软件。启动后在 VMware 主界面点击“创建新的虚拟机”。如下图所示&#xff1a; 开始对新建的虚拟机进行设置。选择“自定义”&#xff0c;然后点击“下一步”。如下图所示&#xff1a; 使用默认配置&#xff0c;单击“下一步”。如下…

PyTorch -- 最常见激活函数的选择

首先&#xff0c;简单复习下什么是梯度&#xff1a;梯度是偏微分的集合 举例说明&#xff1a;对于 z y 2 − x 2 : ∇ z ( ∂ z ∂ x , ∂ z ∂ y ) &#xff08; 2 x , 2 y &#xff09; z y^2-x^2: \nabla z (\frac{\partial z}{\partial x}, \frac{\partial z}{\partia…

夏日炎炎 水域守护:北斗守护安全防线——为生命撑起智能保护伞

随着夏季的来临&#xff0c;炎热的天气让许多人纷纷寻求水的清凉。清凉的河流与广阔的海域成为了不少人消暑降温的向往之地。然而&#xff0c;私自下河、下海的行为却暗藏着巨大的安全隐患&#xff0c;每年夏季溺水事故频发&#xff0c;给无数家庭带来不可挽回的悲痛。为有效遏…

规模弹性: 管理谷歌的TPUv4机器学习超级计算机

摘要 TPUv4&#xff08;张量处理单元&#xff09;是谷歌用于机器学习训练的第三代加速器&#xff0c;采用定制的三维环形互连&#xff0c;部署为 4096 节点的超级计算机。在本文中&#xff0c;我们将介绍设计和运行软件基础设施的经验&#xff0c;这些软件基础设施使 TPUv4 超…

Git进阶使用(图文详解)

文章目录 Git概述Git基础指令Git进阶使用一、Git分支1.主干分支2.其他分支2.1创建分支2.2查看分支1. 查看本地分支2. 查看远程分支3. 查看本地和远程分支4. 显示分支的详细信息5. 查看已合并和未合并的分支 2.3切换分支1. 切换到已有的本地分支2. 创建并切换到新分支3. 切换到远…

【SkiaSharp绘图03】SKPaint详解(一)BlendMode混合模式、ColorFilter颜色滤镜

文章目录 SKPaintSKPaint属性BlendMode获取或设置混合模式SKBlendMode 枚举成员效果预览 Color/ColorF获取或设置前景色ColorFilter 颜色滤镜CreateBlendMode 混合模式CreateColorMatrix 颜色转换CreateCompose 组合滤镜CreateHighContrast 高对比度滤镜CreateLighting 照明滤镜…

flask实战之模板实现公共导航

基础实现 目标 在Flask中&#xff0c;使用模板继承和块&#xff08;blocks&#xff09;可以方便地提取公共导航菜单&#xff0c;使得您可以在多个页面上重用相同的导航结构。以下是一个基本示例&#xff0c;展示如何创建一个包含公共导航菜单的模板&#xff1a; 创建基础模板…