栈(超简单讲解版

2023-05-16

没错又是我来了(上一篇DFS还没写好就先来写队列与栈了哈哈哈哈

是很简单的内容呢 (比DFS简单到哪里去了

先来认识一下栈

什么是栈?

度娘是这样说的:

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

看不太懂 对吧 我也看不懂(划掉

老师是怎么讲的嘞?

是只在表的一端进行插入和删除运算的线性表

可能单看看不懂 那我们举个栗子

(偷图王者

想要取出收纳箱A

先要取出C 再取出B 最后得到A

那么栈的工作原理我们基本了解啦

趁热打铁再继续认识一下

那么栈的工作原理我们基本了解啦

趁热打铁再继续认识一下栈的一些概念 吧~

栈的一些概念 :

继续沿用刚刚那个栗子

借助一下前面的图理解一下:

刚刚将C B A取出的过程 就叫出栈

将 A B C 依此放入的过程 就叫入栈

栈的运用实现语句(结合数组

先要自己定义一个数组s 和一个top(top值随意 但要自己在后面使用的时候记得

左边是常用的 (右边我还没咋用过

栈的运用与相关练习题

1-栈练习 1

考察知识点 入栈 出栈 访问栈顶元素

AC代码

#include<bits/stdc++.h>
using namespace std;
int a[10000001],top=1;
int main()
{
    int q,n,m;
    cin>>q;
    for(int i=1;i<=q;i++)
    {
        cin>>n;
        if(n==1)
        {
            cin>>m;
            a[++top]=m;
        }
        if(n==2)
        {
            top--;
            if(top<1)
            {
                cout<<"impossible!";
                return 0;
            }
        }
    }
    if(top<=1)cout<<"impossible!";
    else cout<<a[top];
}

2-栈练习 2

说多了都是泪 因为没好好读题踩坑了好几次

所以先提一下容易踩坑的点

  1. 不保证栈空时不会出栈

  1. 若最终栈空,或栈空时有出栈操作,输出”impossible!”

考察知识点 入栈 出栈 访问栈顶元素 在计算过程中判断判断栈空

(为什么字体突然变得这么小了

AC代码

#include<bits/stdc++.h>
#include<stack>
using namespace std;
long long s[1000001];
    int a[100000],b[100000]={0};

int main()
{
    
    long long n,top=0;
    int ss=1;
    cin>>n;
    long long k=1;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]==1)
        {
            cin>>b[k];
            s[++top]=b[k];
            k++;
        }
        if(a[i]==2&&top<=0)
        {
            cout<<"impossible!";
            ss=0;
            break;
        }
        if(a[i]==2&&top>=0)
        {
            top--;
        }
        
    }
    if(top>=0&&ss!=0)
    {
    cout<<s[top];
    }
    if(top<=0&&ss!=0)
    cout<<"impossible!";
}

3-栈练习 1

没什么好说的 坑不多 考察知识点比起第一个只增加了在过程中随时访问栈顶元素

AC代码

#include<bits/stdc++.h>
#include<stack>
using namespace std;
long long s[1000001];
    int a[100000],b[100000]={0};

int main()
{
    
    long long n,top=0;
    int ss=1;
    cin>>n;
    long long k=1;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]==1)
        {
            cin>>b[k];
            s[++top]=b[k];
            k++;
        }
        if(a[i]==2)
        {
            top--;
        }
        if(a[i]==3)
        {
            cout<<s[top]<<endl;
        }
        
    }
}

好了 我相信你已经能熟练运用栈了

那么我们来实战演练一下

4-括号匹配

分析

我觉得老师讲的挺好的 所以直接搬上来了(其实是我懒

AC代码

#include<bits/stdc++.h>
#include<stack>
using namespace std;

int main()
{
    char a[260],s[260];
    scanf("%s",a);
    int len=strlen(a);
    int i=0,top=0,flag=1;
    while(i<len&&flag!=0)
    {
        if(a[i]=='['||a[i]=='(')
        {
            s[++top]=a[i];
        }
        if(a[i]==']')
        {
            if(s[top]=='[') top--;
            else flag=0;
        }
        if( a[i]==')')
        {
            if(s[top]=='(') top--;
            else flag=0; 
        }
        i++;
    }
    if(flag==1&&top==0) cout<<"OK";
    else cout<<"Wrong";
    
}

5-后缀表达式

不知道什么是后缀表达式的友们可以去看看这篇博客(大白话 通俗易懂

链接在这儿

AC代码

#include<bits/stdc++.h>
using namespace std;
int s[260];
int top=0;

int main()
{
    char a[260];
    cin.getline(a,260);
    int i=0,x=0,t1,t2;
    while(a[i]!='@')
    {
        if(a[i]>='0' && a[i]<='9')    {
        x=0;
            while(a[i]>='0' && a[i]<='9')
            {
                x=x*10+a[i]-'0';
                i++;
            }
            s[++top]=x;
        }
        if(a[i]=='+')
        {
            t1=s[top--];
            t2=s[top--];
            s[++top]=t1+t2;
        }
        else if(a[i]=='*')
        {
            t1=s[top--];
            t2=s[top--];
            s[++top]=t1*t2;
        }
        else if(a[i]=='-')
        {
            t2=s[top--];
            t1=s[top--];
            s[++top]=t1-t2;
        }
        else if(a[i]=='/')
        {
            t2=s[top--];
            t1=s[top--];
            s[++top]=t1/t2;
        }
        i++;
    }
    cout<<s[top];
    return 0;
}

中缀表达式我还没研究完 后面研究完了我再单独发一篇题解(其实是还没写

6-山峰

分析

当新一座山峰小于前面的山峰时 则存入s数组

大于时清空栈内小于新山峰的元素

等于时无需存入s数组 但能看到的山峰将和上一次一样

AC代码

#include<bits/stdc++.h>
#include<stack>
using namespace std;
int n,a[150000],ans,s[150000],top=1;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    s[1]=a[1];
    for(int i=2;i<=n;i++)
    {
        ans+=top;
        if(s[top]>a[i]) s[++top]=a[i];
        else {
            while(s[top]<=a[i]&&top>=1)
            {
                top--;
            }
            s[++top]=a[i];
        }
    }
    printf("%d",ans);
    return 0;
}

好了这篇学习思路差不多就这样了(毁灭吧我累了(吐血身亡

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

栈(超简单讲解版 的相关文章

随机推荐

  • STM32上SPI+DMA实现大批量读取flash数据

    最近做项目需要使用SPI 43 DMA xff0c 为了做实验感受DMA传输数据块 xff0c 本人以SPI 43 DMA来读取flash中的数据 网上有很多例程是spi直接读取flash xff0c 无法提高性能 因为只是简单的实验SPI
  • stm32通用定时器1s延时实现LED闪烁

    stm32有很多定时器 xff0c 每种定时器的功能也不尽相同 xff0c 今天学习了如何用通用定时器实现1s延时 xff0c 使LED灯闪烁 xff0c 现总结如下 xff1a 步骤总结 xff1a 使能定时器时钟 gt 配置定时器结构体
  • JDK 中使用js调用java类、方法

    最近研究阅读这个APP 其主要功能就是通过一个个书源 从而实现移动端阅读的体验 比如说某些在线小说阅读网站 会加上相应的广告 从而影响用户阅读体验 于是阅读这个APP就是做了类似净化阅读体验 但是小说阅读网站千千万万 如果去适配每个小说阅读
  • Spring项目在tomcat启动时调用action

    1 实现ServletContextListener接口 添加 64 WebListener注解 2 按照示例写代码 xff1a 第一个是开启时 xff0c 第二个是销毁时
  • ubuntu16.04安装opencv3.4

    参考blog https blog csdn net u013066730 article details 79411767 直接进行 完全没问题 sudo apt get install build essential libgtk2 0
  • 使用switch-case语句输出成绩等级

    问题描述 xff1a 输入一个0 100范围内发分数 xff0c 在不同的等级范围内输出不同的值 xff0c 要求使用switch case控制 0 60 等级为E 60 70 等级为D 70 80 等级为C 80 90 等级为B 90 1
  • 输出图案(六)---输出空心矩形

    输入矩形的宽 xff0c 高 xff0c 输出该空心矩形 xff0c 用 来进行表示 参考代码1 xff1a span class hljs comment include lt stdio h gt span span class hlj
  • C语言中交换两个数的方法

    问题描述 xff1a 程序中有两个数a b 其中a 61 4 b 61 5 xff0c 现在希望交换两个数的值 xff0c 使得a 61 5 b 61 4 在这里我总结了一下目前我已经掌握的C语言中交换两个数的方法 xff0c 主要如下几种
  • 输出平行四边形图案(多种方案)

    问题描述 xff1a 使用 在控制台打印平行四边形 例如 xff1a 平行四边形中最长的一行输出的 是5个 xff0c 则平行四边为 xff1a span class hljs bullet span span class hljs emp
  • 自己实现strcat函数

    问题描述 xff1a 自己实现一个MyStrcat函数 xff0c 要和C语言库函数的strcat函数完成同样的功能 问题分析 xff1a 首先我们要了解一下strcat函数它到底做了什么事情 1 函数原型 char strcat char
  • 简易文件打包程序

    对指定目录下面的文件进行打包 简易解包程序参考博客另外一篇文章 xff1a http blog csdn net yi ming he article details 77689453 打包方式 xff1a 把目录下面的文件名 xff0c
  • 简易解包程序

    对压缩包进行解压 简易压缩程序请参考博客的另外一篇文章 xff1a http blog csdn net yi ming he article details 77689405 解包方式 xff1a 根据打包建立的索引表 xff0c 找到对
  • linux 挂载错误Transport endpoint is not connected

    mount了mfs后 xff0c 重新挂载之后 xff0c 出现如下错误 xff1a usr local mfs bin mfsmount H 192 168 103 101 mnt fuse bad mount point 96 mnt
  • 新字体的永久注册

    CString GetCurrentModuleDir TCHAR szPath MAX PATH 43 1 61 0 if 0 61 61 GetModuleFileName HMODULE amp ImageBase szPath MA
  • yolov5/v7/v8自动检测多个文件夹及截取锚框

    目前yolo仅支持检测图片或单个文件夹 xff0c 但在很多时候需要对成百上千个文件夹中图片进行检测 xff0c 再根据得到的位置信息txt文件来截取图片 xff0c 如何一步完成呢 xff0c 详情见下文 在detect py中将save
  • 带参数的宏定义、函数与内联函数

    文章目录 前言一 宏定义1 基本用法2 带参数的宏定义 二 函数1 定义与声明2 调用 三 内联函数 inline总结 前言 在实际项目开发 xff0c 尤其是嵌入式软件项目中 xff0c 经常可以看到大量宏定义的分布 xff0c 其中又多
  • C++语言为什么跨平台?

    xfeff xfeff 现在主流的手机平台很多 xff0c 比如 xff1a Windows开发的Windows Phone xff08 WP 34 X 34 xff09 Apple 苹果公司 开发的ios xff0c Google 谷歌
  • CMake 中的list操作

    Cmake 中定义了一系列的数组操作 xff0c 使用方法如下 list INSERT lt list gt lt element index gt lt element gt lt element gt list REMOVE ITEM
  • 解决error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file

    原文转自CSDN xff0c 本文有删减 一 问题 运行hydra时 xff0c 提示错误 xff1a hydra error span class hljs keyword while span loading span class hl
  • 栈(超简单讲解版

    没错又是我来了 xff08 上一篇DFS还没写好就先来写队列与栈了哈哈哈哈 是很简单的内容呢 xff08 比DFS简单到哪里去了 先来认识一下栈 什么是栈 xff1f 度娘是这样说的 xff1a 栈 xff08 stack xff09 又名