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

第7次课 栈A

课堂学习

栈(stack)

是一种遵循先入后出逻辑的线性数据结构。

我们可以将栈类比为桌面上的一摞盘子,如果想取出底部的盘子,则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素(如整数、字符、对象等),就得到了栈这种数据结构。

如图 5-1 所示,我们把堆叠元素的顶部称为“栈顶”,底部称为“栈底”。将把元素添加到栈顶的操作叫作“入栈”,删除栈顶元素的操作叫作“出栈”。

栈是 OI 中常用的一种线性数据结构。请注意,本文主要讲的是栈这种数据结构,而非程序运行时的系统栈/栈空间。

栈的修改与访问是按照后进先出的原则进行的,因此栈通常被称为是后进先出(last in first out)表,简称 LIFO 表。

栈的常用操作

栈的常用操作如下所示,具体的方法名需要根据所使用的编程语言来确定。在此,我们以常见的 push()pop()peek() 命名为例。

通常情况下,我们可以直接使用编程语言内置的栈类。然而,某些语言可能没有专门提供栈类,这时我们可以将该语言的“数组”或“链表”当作栈来使用,并在程序逻辑上忽略与栈无关的操作。

  1. 栈的操作是可以出栈、入栈交替进行的所以出栈序列并不一定是倒序
  2. 注意:已经出栈的数据不要重复入栈
  3. 注意:并不是所有的出栈序列都可以被操作出来
/* 初始化栈 */
stack<int> stack;/* 元素入栈 */
stack.push(1);
stack.push(3);
stack.push(2);
stack.push(5);
stack.push(4);/* 访问栈顶元素 */
int top = stack.top();/* 元素出栈 */
stack.pop(); // 无返回值/* 获取栈的长度 */
int size = stack.size();/* 判断是否为空 */
bool empty = stack.empty();

练一练

总结:

栈的概念
  • 数据的操作只从一端完成,如存、取等;
  • 数据存放遵循,先进后出,后进先出的原则;
栈的操作
  • 入栈、出栈;
  • 栈顶元素、栈底元素、空栈、满栈:
  • 判断出栈顺序

栈的实现

为了深入了解栈的运行机制,我们来尝试自己实现一个栈类。

栈遵循先入后出的原则,因此我们只能在栈顶添加或删除元素。然而,数组和链表都可以在任意位置添加和删除元素,因此栈可以视为一种受限制的数组或链表。换句话说,我们可以“屏蔽”数组或链表的部分无关操作,使其对外表现的逻辑符合栈的特性。

入栈

 出栈

取栈顶元素

清空栈

#include<bits/stdc++.h>
using namespace std;
int a[6], top = -1;  // 初始化top为 -1,表示栈空void push(int x) {  // 入栈函数if (top < 5) {top++;a[top] = x;}return;
}void pop() {  // 出栈函数if (top > -1) {  // 这里应该是top > -1 ,原代码top>0逻辑有误,栈空时top为 -1top--;}return;
}int getTop() {  // 显示栈顶元素if (top > -1) {return a[top];}return -1;  // 栈空时返回 -1 作为标识
}void clear() {  // 清空栈top = -1;return;
}int main() {push(1);  // 示例入栈操作push(2);cout << getTop() << endl;  // 输出栈顶元素pop();cout << getTop() << endl;clear();return 0;
}
  1. 头文件和命名空间#include<bits/stdc++.h> 包含了大量常用的头文件,using namespace std; 引入标准命名空间,方便使用标准库函数和类型。
  2. 变量定义:定义了数组 a 用于模拟栈,top 用于表示栈顶元素的下标,初始化为 -1 表示栈为空。
  3. 函数实现
    • push 函数:将元素 x 压入栈中,前提是栈未满(top < 5 ,因为数组大小为 6 ,下标从 0 到 5 )。
    • pop 函数:弹出栈顶元素,条件是栈非空(top > -1 )。
    • getTop 函数:获取栈顶元素,栈非空时返回栈顶元素值,栈空返回 -1 。
    • clear 函数:将 top 重置为 -1 ,清空栈。
  4. main 函数:进行了一些栈操作的示例,包括入栈、获取栈顶元素、出栈、再次获取栈顶元素和清空栈等操作,并输出相关结果。

课堂训练

4145 栈的操作

描述

输入5个整数,将这5个整数进行入栈,接下来做三次出栈操作,按照出栈顺序输出出栈元素,以上操作完成后输出此时的栈顶元素。

输入描述

输入5个整数,用空格隔开。

输出描述

输出2行,第1行输出出栈元素,按照出栈顺序输出,用空格隔开。第2行输出完成出栈操作后的栈顶元素。

样例输入 1 

4 9 12 6 7

样例输出 1 

7 6 12
9

提示

数据范围与提示

1≤整数≤1000

#include<bits/stdc++.h>
using namespace std;
int a[6], top;
void push(int x) { //入栈函数if (top<5) {top++;a[top]=x;}return;
}
void pop() { //出栈函数if (top>0) {top--;}return;
}
int getTop() { //显示栈顶元素return a[top];
}
void clear() { //清空栈top=0;return;
}
int main() {int num=0;//入栈for (int i=1;i<=5;i++) {cin>>num;push(num);}//出栈并输出出栈元素for (int i=1;i<=3;i++) {cout<<getTop()<<" ";pop();}//输出栈顶元素cout<<endl<<getTop();return 0;
} 

2858 小鱼的数字游戏

描述

小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字a1、a2、a3…an-1、an ,反着念出来。如:1、2、3,反着念为:3、2、1。这对小鱼的那点记忆力来说实在是太难了,所以请你帮小鱼编程解决这个问题。

输入描述

第一行输入一个整数n(1<n<10)。
第二行输入n个数字,以空格间隔。

输出描述

一行内倒序输出n个数字,以空格间隔。

样例输入 1 

7
3 65 23 5 34 1 30

样例输出 1 

30 1 34 5 23 65 3
#include<bits/stdc++.h>
using namespace std;
int s[101];
int top=0;
//入栈
void push(int x) {if (top<100) {top++;s[top]=x;}return;
}
//出栈
void pop() {if (top>0) {top--;}return;
}
//显示栈顶
int getTop() {return s[top];
}int main() {int n = 0, num = 0;cin>>n;//输入并入栈for (int i = 0; i < n; i++) {cin >> num;push(num); //入栈}//输出并出栈while (top > 0) { //判断栈不为空cout << getTop() << " "; //输出栈顶pop(); //出栈}return 0;
}

2857 小括号问题

描述

假设表达式中只允许包含一种括号:圆括号,需要成对出现。即(( ))或(( )( ))等为正确的格式,(( )或 ( ))或(((均为不正确的格式。
给定一串括号输入(换行作为结束符),检测格式是否正确,若正确输出YES;错误输出NO。
(括号数量≤100)

输入描述

输出描述

样例输入 1 

(())

样例输出 1 

YES
#include<bits/stdc++.h>
using namespace std;
char s[101], a[101];
int top=0;
//入栈
void push(char x) {if (top<200) {top++;s[top]=x;}return;
}
//出栈
void pop() {if (top>0) {top--;}return;
}
//显示栈顶
char getTop() {return s[top];
}
int main() {cin >> a;//获取字符串int len=strlen(a);for (int i=0; i<len; i++) {//左括号入栈if (a[i]=='('){push(a[i]);} else if (getTop()=='(') {pop();} else {cout << "NO";return 0;	}}//栈空时if (top==0) {cout << "YES";//栈非空时} else {cout << "NO";}return 0;
}

2859 括号匹配问题

描述

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,但需要成对出现。即()或 [([ ][ ])]等为正确的格式,[ ( ] )或 ( [ ( ) )或( ( ) ] )均为不正确的格式。
给定一串括号输入(换行作为结束符),检测格式是否正确,若正确输出YES;错误输出NO。
(括号数量≤100)

输入描述

输出描述

样例输入 1 

([]())

样例输出 1 

YES
#include<bits/stdc++.h>
using namespace std;
char s[101], a[101];
int top=0;
//入栈
void push(char x) {if (top<200) {top++;s[top]=x;}return;
}
//出栈
void pop() {if (top>0) {top--;}return;
} 
//显示栈顶
char getTop() {return s[top];
} 
int main() {cin >> a;//获取字符串int len=strlen(a);for (int i=0; i<len; i++) {//左括号入栈if (a[i]=='['||a[i]=='('){push(a[i]);//右括号对比} else if (a[i]==')' && getTop()=='(') {pop();} else if (a[i]==']' && getTop()=='[') {pop();//既匹配不了栈顶也无法入栈} else {cout << "NO";return 0;}}//栈空时if (top==0) {cout << "YES";//栈非空时} else {cout << "NO";}return 0;
}

课后作业

2879  字母的读写
2880 中括号问题
5296 括号成加对数量
1680 调度员的烦恼

相关文章:

第7次课 栈A

课堂学习 栈&#xff08;stack&#xff09; 是一种遵循先入后出逻辑的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子&#xff0c;如果想取出底部的盘子&#xff0c;则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素&#xff08;如整数、字符、对象等&…...

部署RocketMQ

部署环境&#xff1a;jdk8以上&#xff0c;Linux系统 下载和安装指令&#xff1a; wget https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip 显示下载成功&#xff1a; --2025-05-10 11:34:46-- https://archive.apache.org/dist/rocketm…...

软考-软件设计师中级备考 13、刷题 数据结构

倒计时17天时间不多了&#xff0c;数据库、UML、等知识点有基础直接略过&#xff0c;法律全靠考前的一两天刷题&#xff0c;英语直接放弃。 一、数据结构&#xff1a;链表、栈、队列、数组、哈希表、树、图 1、关于链表操作&#xff0c;说法正确的是&#xff1a; A)新增一个头…...

centos的根目录占了大量空间怎么办

问题 当根目录磁盘不够时&#xff0c;就必须删除无用的文件了 上面的&#xff0c;如果删除/usr 或/var是可以释放出系统盘的 定位占空间大的文件 经过命令&#xff0c;一层层查哪些是占磁盘的。 du -sh /* | sort -rh | head -n 10 最终排查&#xff0c;是有个系统日志占了20…...

电子电器架构 --- 新能源高压上下电那点事一文通

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

每日算法-250510

每日算法学习记录 - 250510 1. LeetCode 2086. 喂食仓鼠的最小食物桶数 题目描述: 解题思路 这是一个典型的贪心问题。我们的目标是用最少的食物桶喂饱所有仓鼠。 解题过程 核心思想是&#xff1a;当遇到一只仓鼠时&#xff0c;如何放置食物桶才能最有效地利用这个桶。 …...

渗透测试行业术语1

渗透测试行业术语1 1. 肉鸡 所谓“肉鸡”是一种很形象的比喻&#xff0c;比喻那些可以随意被我们控制的电脑&#xff0c;对方可以是 WINDOWS 系统&#xff0c;也可以是 UNIX/LINUX 系统可以是普通的个人电脑&#xff0c;也可以是大型的服务器我们可以象操作自己的电脑那样来操…...

[思维模式-25]:《本质思考力》-6- 马哲的三大规律:对立统一规律、质量互变规律、否定之否定规律,以及在计算机领域中的体现

一、马克思主义哲学的三大规律 马克思主义哲学的三大规律是对立统一规律、质量互变规律、否定之否定规律&#xff0c;它们共同构成了唯物辩证法的核心内容&#xff0c;揭示了事物发展的根本动力、过程形式和方向特征。 以下是对这三大规律的详细阐述&#xff1a; 1、对立统一…...

Ubuntu22.04安装显卡驱动/卸载显卡驱动

报错 今日输入nvidia-smi报错,在安装了535和550,包括560都没办法解决,但是又怕乱搞导致环境损坏,打算把显卡卸载然后重新安装系统默认推荐版本的显卡驱动 qinqin:~$ nvidia-smi Failed to initialize NVML: Driver/library version mismatch NVML library version: 560.35卸载…...

不同类型的 SAP 项目

目录 1 实施项目 2 SAP S/4 HANA 升级项目 3 数据迁移项目 4 优化项目 5 Rollout 项目 6 运维项目 1 实施项目 企业第一次用 SAP 系统&#xff0c;从硬件搭建到安装 SAP、根据业务流程做配置、开发、培训业务、测试系统直到系统上线。 SAP S/4 HANA ACTIVATE 实施方法论…...

【大模型】使用 LLaMA-Factory 进行大模型微调:从入门到精通

使用 LLaMA-Factory 进行模型微调&#xff1a;从入门到精通 一、环境搭建&#xff1a;奠定微调基础&#xff08;一&#xff09;安装依赖工具&#xff08;二&#xff09;创建 conda 环境&#xff08;三&#xff09;克隆仓库并安装依赖 二、数据准备&#xff1a;微调的基石&#…...

TWAS / FUSION

FUSION 是一套用于执行转录组范围和调控组范围关联研究&#xff08;TWAS 和 RWAS&#xff09;的工具。它通过构建功能/分子表型的遗传成分的预测模型&#xff0c;并使用 GWAS 汇总统计数据预测和测试该成分与疾病的关联&#xff0c;目标是识别 GWAS 表型与仅在参考数据中测量的…...

矩阵短剧系统:如何用1个后台管理100+小程序?深度解析多端绑定技术

短剧行业效率革命&#xff01;一套系统实现多平台内容分发、数据统管与流量聚合 在短剧行业爆发式增长的今天&#xff0c;内容方和运营者面临两大核心痛点&#xff1a;多平台运营成本高与流量分散难聚合。传统模式下&#xff0c;每个小程序需独立开发后台&#xff0c;导致人力…...

使用Python 打造多格式文件预览工具 — 图、PDF、Word、Excel 一站式查看

在日常办公或文件管理场景中&#xff0c;我们经常面临这样的问题&#xff1a;在一个文件夹中短时间内产生了大量不同类型的文件&#xff08;如图片、PDF、Word、Excel&#xff09;&#xff0c;我们需要快速浏览和筛选这些文件的内容&#xff0c;却不希望一个个打开它们。有没有…...

[docker基础四]容器虚拟化基础之 LXC

目录 一 认识LXC 二 LXC容器操作实战 1&#xff09;实战目的 2&#xff09;基础知识 lxc-checkconfig lxc-create lxc-start lxc-ls lxc-info lxc-attach lxc-stop lxc-destory 3&#xff09;安装LXC(我的是Ubuntu) 4&#xff09;操作实战 1. 检查 lxc 是否运行…...

路由策略和策略路由的区别以及配置案例

区别 路由策略&#xff1a;路由策略是通过ACL等方式控制路由发布&#xff0c;让对方学到适当路由条目&#xff0c;比如有20条路由&#xff0c;只想让某个路由器学到10条&#xff0c;可以通过路由策略进行过滤。 策略路由&#xff1a;策略路由是通过定义策略和应用&#xff0c…...

MAD-TD: MODEL-AUGMENTED DATA STABILIZES HIGH UPDATE RATIO RL

ICLR 2025 spotlight paper 构建能够在少量样本下学习出优良策略的深度强化学习&#xff08;RL&#xff09;智能体一直是一个极具挑战性的任务。为了提高样本效率&#xff0c;近期的研究尝试在每获取一个新样本后执行大量的梯度更新。尽管这种高更新-数据比&#xff08;UTD&am…...

PyTorch API 10 - benchmark、data、批处理、命名张量

基于 PyTorch 2.7 文章目录 基准测试工具 - torch.utils.benchmarktorch.utils.bottlenecktorch.utils.checkpointtorch.utils.cpp_extensiontorch.utils.data数据集类型映射式数据集可迭代式数据集 数据加载顺序与采样器加载批处理与非批处理数据自动批处理&#xff08;默认情…...

后缀表达式+栈(详解)(c++)

前言 很抱歉&#xff0c;上一期没有介绍栈stack的用法&#xff0c;今天简要介绍一下&#xff0c;再讲讲后缀表达式&#xff0c;用stack栈做一些后缀表达式的练习。 栈 栈stack是c中系统给出的栈&#xff0c;有了它&#xff0c;就不用自己创建栈啦&#xff01; 头文件 栈sta…...

[C++类和对象]构造函数和析构函数

类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f; 并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6 个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会…...

onenet连接微信小程序(mqtt协议)

一、关于mqtt协议 mqtt协议常用于物联网&#xff0c;是一种轻量级的消息推送协议。 其中有三个角色&#xff0c;Publisher设备&#xff08;客户端&#xff09;发布主题到服务器&#xff0c;其他的设备通过订阅主题&#xff0c;获取该主题下的消息&#xff0c;Publisher可以发…...

使用 JAX-RS 创建 REST 服务/微服务

REST(表述性状态转移)是一种基于 Web 标准和 HTTP 协议的架构风格,广泛用于构建可扩展、无状态且易于消费的 Web 服务。JAX-RS(Java API for RESTful Web Services)是 Java 提供的标准 API,通过注解简化了 RESTful Web 服务的开发和部署。JAX-RS 允许开发者使用 Java 类和…...

人脸真假检测:SVM 与 ResNet18 的实战对比

在人工智能蓬勃发展的当下&#xff0c;人脸相关技术广泛应用于安防、金融、娱乐等诸多领域。然而&#xff0c;随着人脸合成技术的日益成熟&#xff0c;人脸真假检测成为保障这些应用安全的关键环节。本文将深入探讨基于支持向量机&#xff08;SVM&#xff09;结合局部二值模式&…...

如何创建伪服务器,伪接口

创建伪接口一般是用于模拟真实接口的行为&#xff0c;以便在开发和测试过程中进行使用&#xff0c;以下是一些常见的创建伪接口的方法&#xff1a; 使用 Web 框架搭建&#xff1a; Python 和 Flask&#xff1a;Flask 是一个轻量级的 Python Web 框架。示例代码如下&#xff1a;…...

《AI大模型应知应会100篇》第54篇:国产大模型API对比与使用指南

第54篇&#xff1a;国产大模型API对比与使用指南 ——从百度文心到通义千问&#xff0c;一文看懂国内AI平台选型 &#x1f4cc; 摘要 随着中国人工智能产业的快速发展&#xff0c;越来越多的国产大模型平台开始崭露头角。本文将系统梳理当前主流国产大模型 API&#xff08;如…...

质量、重力、引力、惯性 的本质,以及虫洞

1、质量 物体,之所以,有质量源自于其微观结构。物体好比一块海绵,浸没在暗物质的海洋里。随暗物质海洋的涌动而不断移动。海绵微观结构越细密,受到暗物质海洋的裹携力就越大(好比汤勺,与漏勺对汤水的阻碍力。又好比纱窗与船帆对风的阻隔力。) 微观结构越细密,在相同表面积…...

基于ssm+mysql的快递管理系统(含LW+PPT+源码+系统演示视频+安装说明)

系统功能 管理员功能&#xff1a;个人中心、用户管理、订单管理、快递员管理&#xff1b;快递员功能&#xff1a;查看订单、更新快递状态&#xff1b;派单员功能&#xff1a;订单分配、订单管理&#xff1b;客户功能&#xff1a;订单查询、个人信息维护。 作者&#xff1a;计算…...

JVM——即时编译器的中间表达形式

中间表达形式&#xff08;IR&#xff09;&#xff1a;编译器的核心抽象层 1. IR的本质与作用 在编译原理的体系中&#xff0c;中间表达形式&#xff08;Intermediate Representation, IR&#xff09;是连接编译器前端与后端的桥梁。前端负责将源代码转换为IR&#xff0c;而后…...

质心均匀体(引力屏蔽技术)

1、线质心体 陀螺我们都玩过,一个惯性圆盘加一个轴,旋转起来可以独脚而立。(垂直于旋转面的不平衡力,在旋转面旋转180度后,被其自身抵消,故而平衡。可抵消不平衡力的大小,取决于惯性飞轮的质量和旋转的速度)。此时,旋转的陀螺等同于一个轴线质心体(轴线上任意一点提供支…...

深度学习:AI为老年痴呆患者点亮希望之光

引言 随着全球人口老龄化进程的加速&#xff0c;老年痴呆症已成为严重威胁老年人健康和生活质量的公共卫生问题。据世界卫生组织统计&#xff0c;全球每 3 秒钟就有 1 人被诊断为痴呆&#xff0c;预计到 2050 年&#xff0c;全球痴呆患者人数将从目前的约 5000 万激增至 1.52 亿…...