【算法竞赛】栈

news2024/11/14 16:16:46

栈的特点是"先进后出"。

栈在生活中的原型有:坐电梯,先进电梯的被挤在最里面,只能最后出来;一管泡腾片,最先放进管子的药片位于最底层,最后被拿出来。
栈只有唯一的出入口,从这个口进入,也从这个口弹出,这是它与队列最大的区别。
队列有一个入口和一个出口,所以手写栈比手写队列更简单。

编程中常用的递归就是用栈来实现的。栈需要用空间存储,如果栈的深度太大,或者存进栈的数组太大,那么总数会超过系统为栈分配的空间,就会爆栈导致栈溢出。这是递归的主要问题,递归深度要注意。

编码时通常直接用STL stack,或者自己手写找。为避免爆栈,需要控制栈的大小。

STL stack(栈)

STL stack的有关操作如表1.2所示.
在这里插入图片描述
下面用一道例题说明栈的应用:
在这里插入图片描述
代码如下,其中用到了栈的多个操作

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

int main() 
{
    int n;
    scanf("%d", &n);
    getchar();
    while (n--) 
    {
        stack<char> s;
        while (true) 
        {
            char ch = getchar();
            if (ch == ' ' || ch == '\n' || ch == EOF) 
            {
                while (!s.empty()) 
                {
                    printf("%c", s.top());
                    s.pop();
                }
                printf("");
                
                if (ch == '\n' || ch == EOF) 
                	break;
            } 
            
            else
            {
                s.push(ch);
            }
            printf("\n");
        }
    }
    return 0;
}

手写栈

手写栈代码简单且节省空间.
下面针对例题,自己写一个简单的栈.代码中包括栈的基本操作:push()、pop()、top()、empty().用t指向栈顶.

#include<bits/stdc++.h>
const int N = 100100;

struct mystack
{
    char a[N];
    int t = 0;
    
    void push(char x){a[++t]=x;}
    char top() { return a[t];}
    void pop() {t--; }
    int empty() { return t==0?1:0;}
}st;

int main()
{
    int n;
    scanf("%d", &n);
    getchar();
    while(n--)
    {
        while(true) 
        {
            char ch = getchar();
			if(ch=='.' || ch=='\n' || ch==EOF) 
			{
    			while(!st.empty())
    			{
        			printf("%c", st.top());
        			st.pop();
    			}
    			if(ch=='\n' || ch==EOF) break;
    			printf("");
			}
			else st.push(ch);
			printf("\n");
		}
    }
    return 0;
}

单调栈

单调栈不是一种新的栈结构,它在结构上仍然是一个普通的栈,它是栈的一种使用方式。

单调栈内的元素是单调递增或递减的,有单调递增栈、单调递减栈。单调栈可以用来处
理比较问题。

单调栈实际上就是普通的栈,只是使用时始终保持栈内的元素是单调的。例如,单调递
减栈从栈顶到栈底是从小到大的顺序。当一个数入栈时,与栈顶比较,若比栈顶小,则入栈;若比栈顶大,则弹出栈顶,直到这个数能入栈为止。注意,每个数都一定入栈。

单调栈比单调队列简单,因为栈只有一个出入口。
用下面的例题说明单调栈的简单应用。

例1.6
在这里插入图片描述
题解:
从后向前遍历奶牛,并用一个栈保存从低到高的奶牛,栈顶的奶牛最矮,栈底的最高。

具体操作:遍历到奶牛i时,将栈顶的奶牛与其进行比较,如果不比奶牛i高,就弹出栈顶,直到栈顶的奶牛比奶牛i高,这就是奶牛i的仰望对象;然后把i放进栈顶,找中的奶牛仍然保持从低到高。
每头奶牛只进出栈一次,所以复杂度为O(n)。

STL stack代码如下:

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

int main() 
{
    int n;
	scanf("%d", &n);
    
    int h[1005];
    for (int i = 1; i <= n; i++) scanf("%d", &h[i]);
   
    stack<int> st;
    int ans[1005];
    for (int i = n; i >= 1; i--) 
    {
        while (!st.empty() && h[st.top()] <= h[i]) 
        {
            if (!st.empty()) 
            	st.pop();
        }
        ans[i] = st.empty()? 0 : st.top();
        st.push(i);
    }
    
    for (int i = 1; i <= n; i++) 
    	printf("%d ", ans[i]);
    return 0;
}

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

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

相关文章

李宏毅机器学习2023HW12—Reinforcement Learning强化学习

文章目录 TaskBaselineSimpleMedium Baseline—Policy GradientStrong Baseline——Actor-CriticBoss Baseline—Mask Task 实现深度强化学习方法: Policy GradientActor-Critic 环境&#xff1a;月球着陆器 Baseline Simple 定义优势函数(Advantage function)为执行完ac…

传统到AI 大数据分析的演变,颠覆智慧水电的未来?

传统到AI 大数据分析的演变&#xff0c;颠覆智慧水电的未来&#xff1f; 前言传统到AI 大数据分析的演变 前言 水电作为一种重要的能源形式&#xff0c;一直在我们的生活中扮演着至关重要的角色。而如今&#xff0c;随着科技的飞速发展&#xff0c;智慧水电和 AI 大数据应用的…

服务器安全,你必须知道的六个知识点

服务器安全 如今没有什么是安全的。各种系统安全漏洞的数量呈爆炸式增长。令人担忧的主要原因之一是服务器安全性。 接下来&#xff0c;就如何提升服务器安全&#xff0c;写几点见解。 虽然很多企业在服务器的安全性方面做了足够多&#xff0c;但是&#xff0c;黑客仍然能够…

Java项目实战II基于Java+Spring Boot+MySQL的卓越导师双选系统设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 在当今高等教育环境中&#xff0c;师生之间的有效沟通与匹配对于促进学生发展、提升教学质量至关重要…

蓝桥杯—STM32G431RBT6(ADC数模转换,从原理到应用)

一、什么是ADC&#xff1f; ADC&#xff08;Analog-to-Digital Converter&#xff09;即模数转换器。它是一种将模拟信号转换为数字信号的电子器件。在电子系统中&#xff0c;ADC 起着至关重要的作用&#xff0c;它能将连续变化的模拟量&#xff08;如电压、电流等&#xff09;…

openstack中的rabbitmq

基本概念 基础介绍 exchange&#xff1a;用于分发信息&#xff0c;有direct、fanout、topic、headers&#xff1b; binding&#xff1a;exchange、queue之间的虚拟连接&#xff0c;由一个或者多个routing key组成&#xff1b; queues&#xff1a;用来暂存消息&#xff0c;供…

【工具】Windows|两款开源桌面窗口管理小工具Deskpins和WindowTop

总结 Deskpins 功能单一&#xff0c;拖到窗口上窗口就可以置顶并且标记钉子标签&#xff0c;大小 104 KB&#xff0c;开源位置&#xff1a;https://github.com/thewhitegrizzli/DeskPins/releases WindowTop 功能完善全面强大&#xff0c;包括透明度、置顶、选区置顶等一系列功…

API安全推荐厂商瑞数信息入选IDC《中国数据安全技术发展路线图》

近日&#xff0c;全球领先的IT研究与咨询公司IDC发布报告《IDC TechScape&#xff1a;中国数据安全技术发展路线图&#xff0c;2024》。瑞数信息凭借其卓越的技术实力和广泛的行业应用&#xff0c;被IDC评选为“增量型”技术曲线API安全的推荐厂商。 IDC指出&#xff0c;数据安…

Python 如何调用讯飞星火大模型API

1 讯飞星火简介 讯飞星火是科大讯飞推出的一款先进的人工智能大模型&#xff0c;它具备强大的语言理解和知识问答能力&#xff0c;能够在多种场景中提供智能化服务。2024年6月27日&#xff0c;科大讯飞发布了讯飞星火大模型V4.0版本&#xff0c;全面对标GPT-4 Turbo。现有的模…

【JavaScript】LeetCode:41-45

文章目录 41 排序链表42 合并k个升序链表43 LRU缓存44 二叉树的中序遍历45 二叉树的最大深度 41 排序链表 递归 归并排序找到链表中心点&#xff0c;从中心点将链表一分为二。奇数个节点找中心点&#xff0c;偶数个节点找中心左边的点作为中心点。快慢指针找中心点&#xff0c…

thinkPHP 8.0.4 安装

windows 上安装最新版 thinkPHP8.0.4 下载phpStudy V8.1&#xff1a;小皮面板安装Composer2.x&#xff0c;Composer是PHP的一个依赖管理工具&#xff0c;主要功能包括依赖管理、版本控制、自动加载、扩展开发以及集成其他工具。安装 php8.0.2 4. 网站-管理-compose&#xff0c…

基于SpringBoot+Vue的图书管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

使用k8s搭建mariadb+nginx+wordpress

前期准备 1.启动docker进程 2.拉取三个镜像 mariadb:latest wordpress:latest nginx:alpine 3.保存三个镜像 docker save -o wordpress.tar wordpress:latest 4.上传到其他的节点主机 scp wordpress.tar root 192.168.118.88:~ 5.切换到node01和node02两个节点上 ctr…

哪款骨传导耳机值得入手?五款精选好口碑骨传导耳机分享~

不知不觉中&#xff0c;耳机已成为我们生活中不可或缺的电子单品。无论是早晨出门、通勤、工作&#xff0c;甚至入睡&#xff0c;耳机几乎随时相伴。尽管大家都知道长期佩戴耳机会对听力产生影响&#xff0c;但骨传导耳机的出现为我们提供了更安全、卫生的选择&#xff0c;它们…

sql中的union与union all区别

sql中的union与union all区别 1、 区别2、效率3、使用建议 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、 区别 union&#xff1a; 功能&#xff1a;合并多个查询结果集&#xff0c;并自动去除重复行。特点&#xff1a;结果集中不包含重…

从一个文本文件中挑选出符合条件的内容行

某天&#xff0c;张三得到一个需求&#xff0c;将如下格式的文本文件中的文件名开头的内容行提取出来&#xff0c;存入一个新的文本文件。 ok 0 文件名&#xff1a;1_zoukaige.mp3 index:10 文件名&#xff1a;2_dahan.mp3 index:20 文件名&#xff1a;3_kuai.mp3 index:30 文件…

Windows上创建批处理.bat文件并且注册为开机自启(Python-web微服务)

1. winodws桌面点击创建文本文件 &#xff08;文件名称.txt&#xff09; 2. 将如下代码写入txt文件中 echo off if "%1""h" goto begin start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h"…

马踏棋盘c++

马踏棋盘c 题目回溯问题模型特征模型 代码 题目 马踏棋盘算法&#xff0c;即骑士周游问题。将马放在国际象棋的 88 棋盘的某个方格中&#xff0c;马按走棋规则(马走日字)进行移动。每个方格只进入一次&#xff0c;走遍棋盘上全部 64 个方格。 回溯问题模型 特征 解组织成树…

JavaWeb初阶 day1

目录 tomcat目录结构 tomcat:web服务器软件 项目部署的方式 直接将项目放到webapps下 配置conf/server.xml文件 在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写 静态项目和动态项目 Servlet Servlet执行原理 Servlet方法&#xff08;生命周期&#x…

数字化转型的理论框架对比:从多维视角指导企业成功变革对比DPBOKIT4ITCOBITTOGAF

数字化转型的多维框架解析 在数字化时代&#xff0c;企业如何有效实现数字化转型已成为其生存和发展的关键问题。然而&#xff0c;市场上关于数字化管理的各种框架和理论并存&#xff0c;企业需要根据自身的需求选择最适合的指导路径。本文将通过对几个核心理论框架的对比&…