算法模板之栈图文详解


🌈个人主页:聆风吟
🔥系列专栏:算法模板数据结构
🔖少年有梦不应止于心动,更要付诸行动。


文章目录

  • 📋前言
  • [一. ⛳️模拟栈](#一. ⛳️模拟栈)
    • [1.1 🔔用数组模拟实现栈](#1.1 🔔用数组模拟实现栈)
      • [1.1.1 👻栈的定义](#1.1.1 👻栈的定义)
      • [1.1.2 👻向栈顶插入一个数 x(进栈操作)](#1.1.2 👻向栈顶插入一个数 x(进栈操作))
      • [1.1.3 👻从栈顶弹出一个元素(出栈操作)](#1.1.3 👻从栈顶弹出一个元素(出栈操作))
      • [1.1.4 👻判断栈是否为空](#1.1.4 👻判断栈是否为空)
      • [1.1.5 👻查询栈顶元素](#1.1.5 👻查询栈顶元素)
    • [1.2 🌟模板提取(重点)🌟](#1.2 🌟模板提取(重点)🌟)
  • [二. ⛳️题目练习](#二. ⛳️题目练习)
    • [2.1 题目](#2.1 题目)
    • [2.2 输入样例](#2.2 输入样例)
    • [2.3 输出样例](#2.3 输出样例)
    • [2.4 c++代码](#2.4 c++代码)
  • 📝结语

📋前言

💬 hello! 各位铁子们大家好哇,我们上期已经学习了双链表的算法模板,不知道大家都已经掌握了吗?如果你还有缺漏可以通过下面专栏自行跳转学习,今天作者又又又给大家带来了栈的算法模板详细讲解,让我们一起加油进步。

📚 系列专栏:本期文章收录在《算法模板》,大家有兴趣可以浏览和关注,后面将会有更多精彩内容!

🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝


一. ⛳️模拟栈

1.1 🔔用数组模拟实现栈

1.1.1 👻栈的定义

**栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。**如下图是栈的示意图:

1.1.2 👻向栈顶插入一个数 x(进栈操作)

根据栈的定义可知,我们可以将数组看作是横放的栈的示意图,即将数组的首元素位置看作栈底、当前元素的位置看作栈顶,便可以实现数组模拟栈的相关操作。如果我们要向栈顶插入一个元素,将栈顶指针向后移动一位将元素插入进去即可。如下图所示:

代码展示(建议结合图示看注释):

cpp 复制代码
//top表示栈顶
int stk[N], top = -1;

// 向栈顶插入一个数x
stk[++top] = x;

1.1.3 👻从栈顶弹出一个元素(出栈操作)

根据上面所知,如果我们要从栈顶弹出一个元素,我们只需要将栈顶指针向前移动一位即可。如下图所示:

代码展示(建议结合图示看注释):

cpp 复制代码
// 从栈顶弹出一个数
top--;

1.1.4 👻判断栈是否为空

根据上面所知,如果我们要判断栈是否为空,我们只需要判断栈顶指针是否指向数组首元素左边的位置(即判断top是否等于-1位置)。如下图所示:

代码展示(建议结合图示看注释):

cpp 复制代码
// 判断栈是否为空,如果 top >= 0,则表示不为空
if (top >= 0)
{
	//输出栈不为空	
}
else
{
	//输出栈为空
}

1.1.5 👻查询栈顶元素

根据下图所示,查询栈顶元素只需要输出数组下标为top的值即可;

代码展示(建议结合图示看注释):

cpp 复制代码
// 栈顶的值
stk[top];

1.2 🌟模板提取(重点)🌟

C++代码:

cpp 复制代码
// top表示栈顶
int stk[N], top = -1;

// 向栈顶插入一个数x
stk[++top] = x;

// 从栈顶弹出一个数
top-- ;

// 栈顶的值
stk[top];

// 判断栈是否为空,如果 top >= 0,则表示不为空
if (top >= 0)
{
	//输出栈不为空	
}
else
{
	//输出栈为空
}

二. ⛳️题目练习

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

2.1 题目

2.2 输入样例

10

push 5

query

push 6

pop

query

pop

empty

push 4

query

empty

2.3 输出样例

5

5

YES

4

NO

2.4 c++代码

cpp 复制代码
#include <iostream>

using namespace std;

const int N = 100010;
int stk[N], top = -1;

int main()
{
    int m = 0;
    cin >> m;
    
    while(m--)
    {
        string s;
        cin >> s;
        if(s == "push")
        {
            //在栈顶插入一个元素
            int x = 0;
            cin >> x;
            stk[++top] = x;
        }
        else if(s == "pop")
        {
            //从栈顶弹出一个元素
            top--;
        }
        else if(s == "empty")
        {
            //判断栈是否为空
            cout << (top >= 0 ? "NO":"YES" ) << endl;
        }
        else
        {
            //查询栈顶元素
            cout << stk[top] << endl;
        }
    }
    
    return 0;
}

📝结语

本文主要讲解栈的定义、使用数组模拟实现栈的相关操作:向栈顶插入一个数x、从栈顶弹出一个元素、判断栈是否为空、查询栈顶元素,通过栈相关操作的讲解最终我们提取出了栈的算法模板,并通过一个题目的练习结束了今天的课程。希望大家课下能够多敲多练,孰能生巧。

今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,聆风吟的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的最大动力!

相关推荐
DanyHope6 分钟前
LeetCode 两数之和:从 O (n²) 到 O (n),空间换时间的经典实践
前端·javascript·算法·leetcode·职场和发展
xiaoye-duck10 分钟前
吃透C++类和对象(中):拷贝构造函数的深度解析
c++
free-elcmacom13 分钟前
机器学习高阶教程<6>推荐系统高阶修炼手册:混排、多任务与在线学习,解锁精准推荐新境界
人工智能·python·学习·算法·机器学习·机器人
断剑zou天涯14 分钟前
【算法笔记】AC自动机
java·笔记·算法
IT猿手17 分钟前
基于粒子群算法与动态窗口混合的无人机三维动态避障路径规划研究,MATLAB代码
算法·matlab·无人机·多目标优化算法·多目标算法
民乐团扒谱机18 分钟前
【微实验】仿AU音频编辑器开发实践:从零构建音频可视化工具
算法·c#·仿真·audio·fft·频谱
DanyHope21 分钟前
LeetCode 283. 移动零:双指针双解法(原地交换 + 覆盖补零)全解析
数据结构·算法·leetcode
山土成旧客23 分钟前
【Python学习打卡-Day24】从不可变元组到漫游文件系统:掌握数据结构与OS模块
数据结构·python·学习
bulingg36 分钟前
集成模型:gbdt,xgboost,lightgbm,catboost
人工智能·算法·机器学习
d111111111d37 分钟前
编码器测速详情解释:PID闭环控制
笔记·stm32·单片机·嵌入式硬件·学习·算法