首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >栈和队列的C++实现

栈和队列的C++实现

作者头像
狼啸风云
修改于 2022-09-02 13:19:00
修改于 2022-09-02 13:19:00
73400
代码可运行
举报
运行总次数:0
代码可运行

线性表中,先进先出的叫队列,先进后出的叫栈。队列常用于BFS,而在函数递归层数过高时,需要手动实现递归过程,这时候便需要写一个“手动栈”。

         有时候,我们会有大量数据频繁出入队列,但同时存在其内的元素却不多,此时需要写“循环队列”。其代码并不难,但里面下标递增的语句值得斟酌一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
k=(k+1)%maxn;

         这句话用到了取模运算%,是非常浪费时间的。若能避免使用%,则可以大大提高代码运行速度。我做了一个测试,把下面五种语句写法分别运行5×10^8次,在我的机器上用codeblocks10.05各运行5次,取平均数,时间如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
i=(i==maxn-1)?0:(i+1);          // 用时1.582s
if(i==maxn-1) i=0; else ++i;    // 用时1.588s
++i; if(i==maxn) i=0;           // 用时1.605s
++i; i=(i==maxn)?0:i;           // 用时2.040s
i=(i+1)%maxn;                   // 用时4.538s

考虑到codeblocks本身的误差,我单单除去这条语句,将代码其余部分在codeblocks下的运行,依旧5次取平均,时间为:0.015s。

  因此,算入误差可以发现,前两条语句最快,第三条也不错,第四条较慢,最后一条用了3倍的时间。故而我的代码中采用了第一行的写法,建议大家尽量采用前三行的写法。

下面给出代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // 假设储存的信息类型是int
 
 // 栈
 class Stack
 {
     static const int maxn = 10000;
     int S[maxn],L;
 public:
     Stack(): L(0) {}
     void in(int x) { S[L++]=x; }
     int out() { return S[--L]; }
     int size() { return L; }
 };
 
 // 队列
 class Queue
 {
     static const int maxn = 10000;
     int Q[maxn],i,j;
 public:
     Queue(): i(0), j(0) {}
     void in(int x) { Q[j++]=x; }
     int out() { return Q[i++]; }
     int size() { return j-i; }
 };
 
 // 循环队列
 class CycleQueue
 {
     static const int maxn = 10000;
     int Q[maxn],i,j;
     void add(int &k) { k=(k==maxn-1)?0:(k+1); }
 public:
     CycleQueue(): i(0), j(0) {}
     void in(int x) { Q[j]=x; add(j); }
     int out() { int x=Q[i]; add(i); return x; }
     int size() { return (j>i)?(j-i):(j+maxn-i); } // 此处提醒,循环队列元素个数应在0~maxn-1之间,不可达到maxn
38 };
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2020 Multi-University Training Contest 5
a 、b 、c 为 [1,n] 的随机数,将其分别作为直角三棱锥的三条直角边。设直角顶点为 P ,过 P 的高为 h ,求 \frac{1}{h^2} 的期望值。
wenzhuan
2022/08/15
2470
【栈和队列】常见面试题
遍历给定字符串时,当我们遇到左括号时,把它入栈。目的是为了期望在后续的遍历中有一个相同类型的右括号与其匹配。 当我们遍历时遇到的是右括号,此时有3种情况: 1.栈为空,无法匹配返回false。 2.栈不为空,但不是与之匹配的左括号,返回false。 3.栈不为空,是与之匹配的左括号,继续遍历。 在2,3情况下,为了简化书写,我们可以先把栈顶元素出栈,用一个临时变量保存。 如果我们在遍历时都顺利通过,也不能代表这个字符串就是有效的。 比如这种情况:( ( ( ) ) 遍历完后,栈中还会剩下(. 为此最后我们还需要判断栈是否为空,不为空返回false,为空返回true。 注意记得销毁栈
Yui_
2024/10/16
990
【栈和队列】常见面试题
2020牛客暑期多校训练营(第一场)
定义数组 B(s_1s_2…s_k) 。对于 B_i 当存在 j 满足 j<is_j=s_i 时有 i-max(j) ,否则为0。给定串 S ,求 S 每个后缀的 B 函数的字典序
wenzhuan
2022/08/15
3260
Code Forces 149DColoring Brackets(区间DP)
 Coloring Brackets time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Once Petya read a problem about a bracket sequence. He gave it much thought but didn't find a solution. Today you
ShenduCC
2018/04/26
7250
Code Forces 149DColoring Brackets(区间DP)
2017.9.17校内noip模拟赛解题报告
预计分数:100+60+60=220 实际分数:100+60+40=200 除了暴力什么都不会的我。。。。。 T1 2017.9.17巧克力棒(chocolate) 巧克力棒(chocolate) Time Limit:1000ms Memory Limit:64MB 题目描述 LYK 找到了一根巧克力棒,但是这根巧克力棒太长了,LYK 无法一口吞进去。 具体地,这根巧克力棒长为 n,它想将这根巧克力棒折成 n 段长为 1 的巧克力棒,然后 慢慢享用。 它打算每次将一根长为 k 的巧克力棒折成两段长为 a
attack
2018/04/12
9230
2020 Multi-University Training Contest 2
给定一个 n 个点的图,每个点有一权值 b ,每次选择 k 个相互连通的点,使其中每个点权值减一,问最少需要多少操作可以使所有的点权值都为 0(每次选择的 k 必须最大)
wenzhuan
2022/08/15
2950
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-116 最大的算式
        这段时间我会把蓝桥杯官网上的所有非VIP题目都发布一遍,让大家方便去搜索,所有题目都会有几种语言的写法,帮助大家提供一个思路,当然,思路只是思路,千万别只看着答案就认为会了啊,这个方法基本上很难让你成长,成长是在思考的过程中找寻到自己的那个解题思路,并且首先肯定要依靠于题海战术来让自己的解题思维进行一定量的训练,如果没有这个量变到质变的过程你会发现对于相对需要思考的题目你解决的速度就会非常慢,这个思维过程甚至没有纸笔的绘制你根本无法在大脑中勾勒出来,所以我们前期学习的时候是学习别人的思路通过自己的方式转换思维变成自己的模式,说着听绕口,但是就是靠量来堆叠思维方式,刷题方案自主定义的话肯定就是从非常简单的开始,稍微对数据结构有一定的理解,暴力、二分法等等,一步步的成长,数据结构很多,一般也就几种啊,线性表、树、图、再就是其它了。顺序表与链表也就是线性表,当然栈,队列还有串都是属于线性表的,这个我就不在这里一一细分了,相对来说都要慢慢来一个个搞定的。蓝桥杯中对于大专来说相对是比较友好的,例如三分枚举、离散化,图,复杂数据结构还有统计都是不考的,我们找简单题刷个一两百,然后再进行中等题目的训练,当我们掌握深度搜索与广度搜索后再往动态规划上靠一靠,慢慢的就会掌握各种规律,有了规律就能大胆的长一些难度比较高的题目了,再次说明,刷题一定要循序渐进,千万别想着直接就能解决难题,那只是对自己进行劝退处理。加油,平常心,一步步前进。
红目香薰
2023/02/16
2830
【奶昔队ROUND#1】
模拟,不过我做的时候不是模拟,是计算...(写了好久,还wa了几次),现在看了别人的代码写过一份。
饶文津
2020/06/02
2970
Codeforces Round #625解题报告
题目链接 题意:两种机器人对于n个问题有会和不会(1和0) 希望第一种的得分比第二种高 要如何安排问题分数分布 要求分数中最大的尽量小 算一下第一种比第二种多的1和0 除一下 可能会除零 要先判掉再除
wenzhuan
2022/08/15
2250
2020 Multi-University Training Contest 3
给定一个长度为 n 的序列 a ,可以两两间任意合并(合并为两数之和同时数组长度减一)。问最多能合并出多少个 k 的倍数(可以不操作)。
wenzhuan
2022/08/15
2790
数据结构 栈&队列
2-4 依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是( ) 删除,移动头指针; 增加,移动尾指针; 删除a,b ,队头c 2-3 在一个链队列中,front和rear分别为头指针和尾指针,则插入一个结点s的操作为( ) 这道题目,我坚持自己的答案,就是这个答案! 2-1 若用大小为6的数组来实现循环队列,且当前front和rear的值分别为0和4。当从队列中删除两个元素,再加入两个元素后,front和rear的值分别为多少?  删除,front+
Kindear
2018/01/15
3.4K0
数据结构 栈&队列
2020牛客暑期多校训练营(第二场)
定义函数 f(s,t) 为 s 前缀和 t 后缀的最长相同长度。给定 n 个串,求两两 f 和。
wenzhuan
2022/08/15
3310
P1018 乘积最大
题目描述 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时会有以下两种分法: 1
attack
2018/04/13
7220
codeforces round #257 div2 C、D「建议收藏」
由于横切+竖切(或竖切+横切)会对分割的东西产生交叉份数。从而最小的部分不会尽可能的大。
全栈程序员站长
2022/07/10
2240
NOIP2020 前练习笔记
给一棵树,每个点权值为 w_i,需要将节点分组。 分组要求:每个组内的点,两两不存在祖先——后代关系。 每个组的代价是组内的最大值,求最小的总代价。
Clouder0
2022/09/23
5570
hdu1067
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> using namespace std; #define MAXN 1000007 typedef long long ll; ll Hash[MAXN]; struct Node{ int map[4][8],step; bool operator == (const Node &p) cons
@坤的
2018/06/04
4330
快乐AC三道题---第一周
我们要解决的无非是是否把下一个元素加入,是否开始维护一个新的子段。我们开一个数组b[] , 记录b[i],表示以a[i]结尾的全部子段中 最大的那个的 和。 这样我们就可以根据它b[i] 的正负,去考虑是否把下一个元素加入到当前的子段。 如果b[i] 是负数,那么我们为什不从a[i+1]新维护一个子段呢? 如果b[i] 是正数,那么显然可以继续把a[i+1] 加入到当前的子段。最后我们只需要找出所有最大子段中,最大的那个。
杨鹏伟
2020/09/11
3850
栈和队列专项练习
为满时: 此时需要考虑空间的问题, 1.若只取k个空间 需要进入数据时,tail被赋值,tail向后移一个,当最后一块空间被赋值时,tail回到下标为0的数组中, 此时tail ==front与判断空的条件相同 ,所以不成立。
lovevivi
2022/11/10
3130
栈和队列专项练习
有关栈和队列应用的oj题讲解
我们首先调用创建好的队列代码,然后假设令这两个队列作为一个栈,由于我们画图可以得出一个结论:
羑悻的小杀马特.
2025/01/23
630
有关栈和队列应用的oj题讲解
模式匹配KMP算法
匹配到j=5时失效了,BF算法里我们会使i=1,j=0,再看s的第i位开始能不能匹配,而KMP算法接下来就去比较T[2](next[5]=2)和S[5]
饶文津
2020/05/31
1.1K0
相关推荐
2020 Multi-University Training Contest 5
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档