栈--专题讲解

news/2024/6/29 13:57:54

文章目录

    • 基本概念
    • 模拟栈
    • 数据结构-栈:stack
        • 头文件
        • 定义
        • 基本操作
    • 实例:火车进栈
      • 题目大意
      • 解题思路
      • AC代码

基本概念

栈的定义
栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈低(bottom)。不含元素的空表称为空栈。因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出的线性表(简称LIFO:Last in, First out.结构)。

例如:stack:1 2 3 4 5
类似于放盘子
视图如下:

后进先出
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

模拟栈

先进后出
比较简单直接放截屏
在这里插入图片描述

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

# 用数组模拟栈
const int N=100;
int stk[N],tt=0;  # stk代表的是栈数组,tt就是栈顶指针

# 栈顶
栈顶指针:tt
栈顶元素:stk[tt];

# 入栈:栈顶指针先+1,然后入栈
stk[++tt]=66;

# 出栈:栈顶指针先-1,然后出栈
tt--;

# 判断栈是否为空
if(tt==0) true
else false

数据结构-栈:stack

栈,先进后出

头文件

#include <stack> 

定义

stack<int> st;

基本操作

empty() 堆栈为空则返回真

pop() 移除栈顶元素

push() 在栈顶增加元素

size() 返回栈中元素数目

top() 返回栈顶元素

#include<bits/stdc++.h>
#include<stack>
// 包含了stack这个头文件
using namespace std;

// 使用数据结构的栈
//定义一个栈
stack<int> stk;

/*
empty() 堆栈为空则返回真

pop() 移除栈顶元素

push() 在栈顶增加元素

size() 返回栈中元素数目

top() 返回栈顶元素
*/

int main(){
    
    //入栈
    stk.push(10);
    stk.push(20);
    stk.push(30);
    
    //查看栈顶元素
    cout<<stk.top();
    //cout == print
    
    //出栈
    stk.pop();
    
    //查看栈顶元素
    cout<<" "<<stk.top();
    
    //查看栈元素个数
    cout<<" size="<<stk.size();
    
    return 0;
}

实例:火车进栈

原题链接:
https://www.acwing.com/problem/content/131/

题目描述
这里有 n 列火车将要进站再出站,但是,每列火车只有 1 节,那就是车头。

这 n 列火车按 1 到 n 的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出。

也就是说这个火车站其实就相当于一个栈,每次可以让右侧头火车进栈,或者让栈顶火车出站。

车站示意如图:

        出站<——    <——进站
                 |车|
                 |站|
                 |__|

现在请你按《字典序》输出前 20 种可能的出栈方案。

输入格式
输入一个整数 n,代表火车数量。

输出格式
按照《字典序》输出前 20 种答案,每行一种,不要空格。

数据范围
1≤n≤20
输入样例:
3
输出样例:
123
132
213
231
321

题目大意

输出 1 、 2 、 . . . . . . 、 n {1、2、......、n} 12......n的按字典序前20个出栈情况

解题思路

模拟栈的出栈情况,对于每一次栈有两个选择,要么进栈,要么出栈。
由此,我们可以知道我们需要三个变量:可以用stack3来表示入栈的数值,每入一次栈就加一;用stack2表示栈中的情况,当栈不为空的时候才可以出栈;stack1来表示出栈情况
我们可以通过递归来实现整个过程:

1.当stack1的长度为n时,那么达到边界
2.当stack2不为空的时候出栈
3.入栈

注意:每次操作后记得还原栈的情况
在这里插入图片描述

AC代码

#include<iostream>
#include<vector>
#include<stack>
using namespace std;

int n;
int cnt = 20,stack3;
vector<int> stack1;
stack<int> stack2;

void dfs(){
    if(!cnt) return ;
    //边界条件
    if(stack1.size()==n){
        cnt--;
        for(int i=0;i<n;i++) cout<<stack1[i];
        cout<<endl;
        return ;
    }
    
    //出栈
    if(!stack2.empty()){
        stack1.push_back(stack2.top());
        stack2.pop();
        dfs();
        stack2.push(stack1.back());
        stack1.pop_back();
    }
    
    //入栈
    if(stack3<n){
    stack3++;
    stack2.push(stack3);
    dfs();
    stack2.pop();
    stack3--;
    }
    return;
}

int main(){
    cin>>n;
    dfs();
    return 0;
}

http://lihuaxi.xjx100.cn/news/624267.html

相关文章

JavaWeb登录注册系统/界面(邮箱验证码,数据库连接,详细注释,可作结课作业,可用于学习,可接入其他主系统)

目录 1、前言 2、系统实机演示 3、系统分析与设计 &#xff08;1&#xff09;主要软件与工具 &#xff08;2&#xff09;系统分析 &#xff08;3&#xff09;系统规划 4、系统设计与构建 &#xff08;1&#xff09;JavaWeb创建 &#xff08;2&#xff09;JavaWeb运行 …

Apache Sling App CMS <1.1.4 存在反射型XSS漏洞(CVE-2022-46769)

漏洞描述 Apache Sling 是一个基于可扩展内容树&#xff08;extensible content tree&#xff09;的 RESTful Web 应用框架。 1.1.4 之前版本的 Apache Sling 中的 cms.js#confirmMessage 方法未对用户可控的 title 和 message 参数进行过滤&#xff0c;攻击者可将精心构造的…

nginx 如何处理https 协议访问http 协议图片的问题

1.先在后端转换成代理路径 2.然后再配置nginx,转换成http路径,实现访问

Python下opencv使用笔记(图像频域滤波与傅里叶变换)

前面曾经介绍过空间域滤波,空间域滤波就是用各种模板直接与图像进行卷积运算,实现对图像的处理,这种方法直接对图像空间操作,操作简单,所以也是空间域滤波。 频域滤波说到底最终可能是和空间域滤波实现相同的功能,比如实现图像的轮廓提取,在空间域滤波中我们使用一个拉普…

服务器安装宝塔

一:连接tabby,登录系统 新建 新配置 ssh连接 输入名称,主机 二:输入用户名和密码(默认为root,密码自己设置) 然后再输入宝塔对应的安装脚本 宝塔链接:https://www.bt.cn/new/download.html 三:初始化成功

1.H3CNE-计算机网络概述

计算机网络概述计算机网络定义一组自治计算机互联的集合计算机网络基本功能资源共享综合信息服务分布式处理与负载均衡计算机网络的类型局域网LAN&#xff08;Local Area Network) 由用户自行建设&#xff0c;使用私有地址组建的网络城域网MAN(Metropolitan Area Network)由运营…

LeetCode[215]数组中的第K个最大元素

难度&#xff1a;中等题目&#xff1a;给定整数数组 nums和整数 k&#xff0c;请返回数组中第 k个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k个最大的元素&#xff0c;而不是第 k个不同的元素。你必须设计并实现时间复杂度为 O(n)的算法解决此问题。示例 1:输…

TiDB 底层存储结构 LSM 树原理介绍

随着数据量的增大&#xff0c;传统关系型数据库越来越不能满足对于海量数据存储的需求。对于分布式关系型数据库&#xff0c;我们了解其底层存储结构是非常重要的。本文将介绍下分布式关系型数据库 TiDB 所采用的底层存储结构 LSM 树的原理。 1 LSM 树介绍 LSM 树&#xff08…