【算法基础】栈与队列

news2025/1/23 17:34:54

一、栈

1.1 模拟栈

实现一个栈,栈初始为空,支持四种操作:

  1. push x – 向栈顶插入一个数 x

  1. pop – 从栈顶弹出一个数;

  1. empty – 判断栈是否为空;

  1. query – 查询栈顶元素。

现在要对栈进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。

输入格式

第一行包含整数 M,表示操作次数。

接下来 M 行,每行包含一个操作命令,操作命令为 push xpopemptyquery 中的一种。

输出格式

对于每个 emptyquery 操作都要输出一个查询结果,每个结果占一行。

其中,empty 操作的查询结果为 YESNOquery 操作的查询结果为一个整数,表示栈顶元素的值。

数据范围

1≤M≤100000

1≤x≤109

所有操作保证合法。

输入样例:

10push5
query
push6pop
query
pop
empty
push4
query
empty

输出样例:

55YES4NO

代码

dada

34

#include <iostream>

using namespace std;

const int M = 100010;


int stk[M], tt;

int m;




int main()
{
    cin >> m;
    while (m -- )
    {
        string op;
        int x;
        
        cin>>op;
        if(op=="push")
        {
            cin >> x;
            stk[ ++tt ] = x;
        
        }
        else if (op == "pop") tt--;
        else if (op == "empty") cout << (tt ?"NO" : "YES") <<endl;
        else cout << stk[tt] <<endl;
    }
    
    
    return 0;
}

35

36

1.2表达式求值

给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。

注意:

  • 数据保证给定的表达式合法。

  • 题目保证符号 - 只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)*(-(1+1)+2) 之类表达式均不会出现。

  • 题目保证表达式中所有数字均为正整数。

  • 题目保证表达式在中间计算过程以及结果中,均不超过 231−1

  • 题目中的整除是指向 0 取整,也就是说对于大于 00 的结果向下取整,例如 5/3=1,对于小于 0 的结果向上取整,例如 5/(1−4)=−15/(1−4)=−1。

  • C++和Java中的整除默认是向零取整;Python中的整除//默认向下取整,因此Python的eval()函数中的整除也是向下取整,在本题中不能直接使用。

输入格式

共一行,为给定表达式。

输出格式

共一行,为表达式的结果。

数据范围

表达式的长度不超过 105

输入样例:

(2+2)*(1+1)

输出样例:

8

思路:

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>
#include <unordered_map>

using namespace std;

stack<int> num;
stack<char> op;

void eval()
{
    auto b = num.top(); num.pop();
    auto a = num.top(); num.pop();
    auto c = op.top(); op.pop();
    int x;
    if (c == '+') x = a + b;
    else if (c == '-') x = a - b;
    else if (c == '*') x = a * b;
    else x = a / b;
    num.push(x);
}

int main()
{
    unordered_map<char, int> pr{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};
    string str;
    cin >> str;
    for (int i = 0; i < str.size(); i ++ )
    {
        auto c = str[i];
        if (isdigit(c))
        {
            int x = 0, j = i;
            while (j < str.size() && isdigit(str[j]))
                x = x * 10 + str[j ++ ] - '0';
            i = j - 1;
            num.push(x);
        }
        else if (c == '(') op.push(c);
        else if (c == ')')
        {
            while (op.top() != '(') eval();
            op.pop();
        }
        else
        {
            while (op.size() && op.top() != '(' && pr[op.top()] >= pr[c]) eval();
            op.push(c);
        }
    }
    while (op.size()) eval();
    cout << num.top() << endl;
    return 0;
}

1.3 单调栈

给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1−1。

输入格式

第一行包含整数 N,表示数列长度。

第二行包含 N 个整数,表示整数数列。

输出格式

共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1−1。

数据范围

1≤N≤105

1≤数列中元素≤109

输入样例:

5
3 4 2 7 5

输出样例:

-1 3 -1 2 2

代码:

#include <iostream>

using namespace std;


const int N =1e5+10;
int st[N];
int tt;

int main()
{
    int n;
    cin >> n;

    for (int i = 0; i < n; i ++ )
    {
        int x;
        cin >> x;

        while ( tt && st[tt] >= x)
        {
            tt--;
        }

        if(tt) cout << st[tt] << ' ';

        else cout << -1 << ' ';

        st[++tt] = x;



    }

    return 0;
}

二、队列

2.1 模拟队列

实现一个队列,队列初始为空,支持四种操作:

  1. push x – 向队尾插入一个数 x

  1. pop – 从队头弹出一个数;

  1. empty – 判断队列是否为空;

  1. query – 查询队头元素。

现在要对队列进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。

输入格式

第一行包含整数 M,表示操作次数。

接下来 M 行,每行包含一个操作命令,操作命令为 push xpopemptyquery 中的一种。

输出格式

对于每个 emptyquery 操作都要输出一个查询结果,每个结果占一行。

其中,empty 操作的查询结果为 YESNOquery 操作的查询结果为一个整数,表示队头元素的值。

数据范围

1≤M≤100000,

1≤x≤109,

所有操作保证合法。

输入样例:

10
push
6
empty
query
pop
empty
push 3
push 4
pop
query
push 6

输出样例:

NO
6
YES
4

代码:

#include <iostream>

using namespace std;

const int N = 1e5+10;

int q[N];

int hh, tt = -1;

int main()
{
    int m;
    cin >> m;

    for (int i = 0; i < m; i ++ )
    {
        string str;
        int x;
        cin >> str;

        if (str == "push")
        {

            cin >> x;
            q[ ++ tt ] = x;



        }
        else if (str == "pop")
        {
            hh++;
        }
        else if (str == "empty")
        {
            if(hh <= tt)
            {
                cout << "NO" <<endl;
            }
            else 
            {
                cout << "YES" << endl;
            }
        }
        else
        {
            cout << q[hh] << endl;
        }
    }


}

2.2 单调队列

单调队列:队列内的元素值是单调的,递增或递减。本题用单调队列存储当前窗口内单调递减的元素,并日队头是窗口内的最大值,队尾是窗口内的尾元素。也就是说,队列从队头到队尾对应窗口内从最大值到尾元素的一个子序列。

1.队头出队:当队头的元素从窗口滑出时,队头元素出队(head++)

2. 队尾入队: 当新元素滑入窗口时,要把新元素从队尾插入,分两种情况:

第一种:

直接插入: 如果新元素小于队尾元素,那就百接从队尾插入 ( ++tail),因为它可能在前面的最大值滑出窗口后成为最大值;

第二种:

先删后插:如果新元素大于等于队尾元素,那就先删除队尾元素(因为它不可能成为窗口中的最大值),删除方法是tail--,即从队尾出队。循环删除,直到队空或遇到一个大于新元素的值,插

入其后 (++tail)

这样做,每次都能从队头取得窗口中的最大值。

给定一个大小为 n≤106 的数组。

有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。

你只能在窗口中看到 k 个数字。

每次滑动窗口向右移动一个位置。

以下是一个例子:

该数组为 [1 3 -1 -3 5 3 6 7]k3

窗口位置

最小值

最大值

[1 3 -1] -3 5 3 6 7

-1

3

1 [3 -1 -3] 5 3 6 7

-3

3

1 3 [-1 -3 5] 3 6 7

-3

5

1 3 -1 [-3 5 3] 6 7

-3

5

1 3 -1 -3 [5 3 6] 7

3

6

1 3 -1 -3 5 [3 6 7]

3

7

你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。

输入格式

输入包含两行。

第一行包含两个整数 nk,分别代表数组长度和滑动窗口的长度。

第二行有 n 个整数,代表数组的具体数值。

同行数据之间用空格隔开。

输出格式

输出包含两个。

第一行输出,从左至右,每个位置滑动窗口中的最小值。

第二行输出,从左至右,每个位置滑动窗口中的最大值。

输入样例:

8 3
1 3 -1 -3 5 3 6 7

输出样例:

-1 -3 -3 -3 3 3
3 3 5 5 6 7

代码:

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1e6+10;
int q[N], a[N], tt = -1, hh=0;
int n,k;



int main()
{
    cin >> n>> k;

    for (int i = 0; i < n; i ++ ) cin >> a[i];
    for (int i = 0; i < n; i ++ )
    {
         if(hh<= tt && q[hh] < i-k+1) hh++;
         while (hh <= tt && a[q[tt]] >=a[i]) tt--;
         q[ ++ tt] = i;
         if( i >= k-1) cout << a[q[hh]]<<" ";
    }
    puts("");
    
    hh = 0, tt = -1;
    for (int i = 0; i < n; i ++ )
    {
         if(hh<= tt && q[hh] < i-k+1) hh++;
         while (hh <= tt && a[q[tt]] <=a[i]) tt--;
         q[ ++ tt] = i;
         if( i >= k-1) cout << a[q[hh]]<<' ';
    }
    puts("");
    
}

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

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

相关文章

【2023最火教程】Python性能测试框架Locust实战教程(建议收藏)

01、认识Locust Locust是一个比较容易上手的分布式用户负载测试工具。它旨在对网站&#xff08;或其他系统&#xff09;进行负载测试&#xff0c;并确定系统可以处理多少个并发用户&#xff0c;Locust 在英文中是 蝗虫 的意思&#xff1a;作者的想法是在测试期间&#xff0c;放…

图解 paxos 论文《The Part-Time Parliament》

本文以图文并茂的方式重新演绎 Paxos 开山之作 《The Part-Time Parliament》[1]&#xff0c;并尝试解释原论文中语焉不详的地方。 背景 在 Paxos 小岛上&#xff0c;施行着一种 Parliament(议会) 政治。小岛上执行的所有 decree(法令) 都需要先由 Parliament 在 Chamber 内表…

leetcode 21~30 学习经历

leetcode 21~30 学习经历21. 合并两个有序链表22. 括号生成23. 合并K个升序链表24. 两两交换链表中的节点25. K 个一组翻转链表26. 删除有序数组中的重复项27. 移除元素28. 找出字符串中第一个匹配项的下标29. 两数相除30. 串联所有单词的子串小结21. 合并两个有序链表 将两个升…

15. Qt中OPenGL的参数传递问题

1. 说明 在OPenGL中&#xff0c;需要使用GLSL语言来编写着色器的函数&#xff0c;在顶点着色器和片段着色器之间需要参数值的传递&#xff0c;且在CPU中的数据也需要传递到顶点着色器中进行使用。本文简单介绍几种参数传递的方式&#xff1a; &#xff08;本文内容仅个人理解&…

学校节能减排实施方案-浅析高校能耗及节能管理

摘要:高校能源管理是高校治理体系和高校后勤保障的重要组成部分。利用数据统计等手段对蚌埠医学院近年来的能源使用情况进行统计分析&#xff0c;通过横向及纵向对比&#xff0c;结合国家相关政策法规及同类高校能耗情况&#xff0c;对该校能源消耗现状进行了综合分析&#xff…

Web3中文|2023年zk赛道爆发,即将推出的Polygon zkEVM有多重要?

Crypto行业被广泛关注的零知识证明&#xff08;Zero—Knowledge Proof&#xff09;技术&#xff0c;在1980年就被数学家S.Goldwasser、S.Micali及C.Rackoff提出。 零知识证明涉及一系列步骤&#xff0c;可以实现密码学中的「可用而不可知」。 而区块链有着公开透明、不可篡改…

Nginx之反向代理、负载均衡、动静分离。

Nginx之反向代理、负载均衡、动静分离。 1、Nginx是啥&#xff1f; 轻量级Web服务器、反向代理服务器、电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器 在 BSD-like 协议下发行、占内存少、并发高&#xff08;同时处理请求能力&#xff09;。 2、安装 官网&#xf…

【Python】序列与列表(列表元素的增删改查,求之,列表推导式、列表的拷贝)

一、序列序列的概念&#xff1a;按照某种顺序排列的数据类型就叫做序列&#xff0c;比如字符串&#xff0c;列表&#xff0c;元组&#xff0c;集合序列的共同点是都有下标&#xff0c;支持index()方法和count()&#xff0c;也支持切片处理(等同于字符串序列的切片处理)l1 [0, …

Leetcode(每日一题)——1140. 石子游戏 II

摘要 ​​​​​​1140. 石子游戏 II 877. 石子游戏 1406. 石子游戏 III 375. 猜数字大小 II 464. 我能赢吗 486. 预测赢家 1025. 除数博弈 一、动态规划解析 Alice一开始有两个选择&#xff1a;拿前一堆/前两堆石子。如果 Alice 拿前一堆&#xff0c;那么轮到 Bob 时…

Propargyl-PEG1-SS-PEG1-PFP ester,1817735-30-0,炔基应用于生物标记

【中文名称】丙炔-单乙二醇-二硫键-单乙二醇-五氟苯酚酯【英文名称】 Propargyl-PEG1-SS-PEG1-PFP ester【结 构 式】【CAS号】1817735-30-0【分子式】C16H15F5O4S2【分子量】430.4【基团部分】炔基基团【纯度标准】95%【包装规格】1g&#xff0c;5g&#xff0c;10g&#xff0c…

互联网行业中,哪些岗位越老越吃香?

你是不是也想转行IT行业&#xff0c;找一门适合自己学习&#xff0c;能拿高薪的技术&#xff0c;最好还越老越吃香&#xff1f;或许先应该看看对应岗位&#xff0c;老资格的同行们可以拿到的薪资数再做判断。整体上看&#xff0c;大部分岗位的起薪水平相差不大&#xff0c;但随…

matplotlib绘制三维图

目录线状堆积图 PolygonPlot三维表面图 SurfacePlot散点图ScatterPlot柱形图 BarPlot三维直方图螺旋曲线图 LinePlotContourPlot轮廓图网状图 WireframePlot箭头图二维三维合并文本图Text三维多个子图线状堆积图 PolygonPlot Axes3D.add_collection3d(col, zs0, zdir‘z’)  …

(考研湖科大教书匠计算机网络)第六章应用层-第一、二节:应用层概述和C/S及P2P

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;应用层概述二&#xff1a;客户/服务器&#xff08;C/S&#xff09;和对等&#xff08;P2P&#xff09;方式&#xff08;1&#xff09;客户/服务器&…

Vue页面组成及常用属性

一、Vue页面组成 目前的项目中&#xff0c;Vue页面都是采用组件套娃的形式&#xff0c;由一个一个的组件拼接而成整个页面。一个组件就是一个.vue文件。组件通常由template和script两部分组成&#xff1a; template部分&#xff1a;页面展示的具体元素内容&#xff0c;比如文字…

Type-c诱骗取电芯片大全

随着Type-C的普及和推广&#xff0c;目前市面上的电子设备正在慢慢淘汰micro-USB接口&#xff0c;逐渐都更新成了Type-C接口&#xff0c;micro-USB接口从2007年上市&#xff0c;已经陪伴我们走过十多个年头&#xff0c;如今也慢慢退出舞台。 今天我们评测的产品是市面上Type-C…

【OJ】最小字典序游戏

&#x1f4da;Description: 牌王和图王在玩一个游戏。 他们需要轮流移动字符串上的L&#xff0c;R指针&#xff0c;最后一位无法移动的人会输掉游戏。 给定一个字符串 s &#xff0c;起初有两个指针 L 和 R 都指向字符串的下标为k的位置(1 < k < | s |&#xff0c;|s…

CCNP350-401学习笔记(501-550题)

501、Refer to the exhibit. What is the effect of the configuration? A. The device will allow users at 192.168.0.202 to connect to vty lines 0 through 4 using the password ciscotestkey B. The device will allow only users at 192 168.0.202 to connect to vty …

Mybatis-Plus入门系列(20) -兼容多种数据库

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言方案分析1. 分页2. XML自定义SQL案例演示1. 配置2. 简单分页查询3. 带方言的分页查询参考前言 在我们实际开发软件产品过程中&#xff0c;数据库的类型可能不是确定的&#xff0c;也有客户…

PHP面试题

PHP相关 php7新特性 1.类型的声明 php7可以声明函数传参的类型和返回值的类型&#xff0c;比如可以用int&#xff0c;string声明参数和返回值的类型&#xff0c;如下&#xff1a; 代码&#xff1a;declare(strict_types1); function add(int $a,int $b):int{ return $a$b;…

深入浅出C++ ——手撕AVL树

文章目录前言一、AVL 树介绍二、AVL树节点的定义三、AVL树的插入四、AVL树的旋转五、AVL树的验证六、AVL树的删除七、AVL树的性能八、AVL树的实现前言 在前面的文章中介绍了map / multimap / set / multiset 容器&#xff0c;这几个容器的底层都是按照二叉搜索树来实现的。但是…