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

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

k=(k+)%maxn;

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

 i=(i==maxn-)?:(i+);          // 用时1.582s
if(i==maxn-) i=; else ++i; // 用时1.588s
++i; if(i==maxn) i=; // 用时1.605s
++i; i=(i==maxn)?:i; // 用时2.040s
i=(i+)%maxn; // 用时4.538s

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

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

下面给出代码:

 // 假设储存的信息类型是int

 // 栈
class Stack
{
static const int maxn = ;
int S[maxn],L;
public:
Stack(): L() {}
void in(int x) { S[L++]=x; }
int out() { return S[--L]; }
int size() { return L; }
}; // 队列
class Queue
{
static const int maxn = ;
int Q[maxn],i,j;
public:
Queue(): i(), j() {}
void in(int x) { Q[j++]=x; }
int out() { return Q[i++]; }
int size() { return j-i; }
}; // 循环队列
class CycleQueue
{
static const int maxn = ;
int Q[maxn],i,j;
void add(int &k) { k=(k==maxn-)?:(k+); }
public:
CycleQueue(): i(), j() {}
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
};

《数据结构》C++代码 栈与队列的更多相关文章

  1. SDUT-3335_数据结构实验之栈与队列八:栈的基本操作

    数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具 ...

  2. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

  3. SDUT-2088_数据结构实验之栈与队列十一:refresh的停车场

    数据结构实验之栈与队列十一:refresh的停车场 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description refresh最近发 ...

  4. SDUT-2449_数据结构实验之栈与队列十:走迷宫

    数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...

  5. SDUT-1479_数据结构实验之栈与队列九:行编辑器

    数据结构实验之栈与队列九:行编辑器 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个简单的行编辑程序的功能是:接受用 ...

  6. SDUT-3334_数据结构实验之栈与队列七:出栈序列判定

    数据结构实验之栈与队列七:出栈序列判定 Time Limit: 30 ms Memory Limit: 1000 KiB Problem Description 给一个初始的入栈序列,其次序即为元素的 ...

  7. SDUT-3332&3333_数据结构实验之栈与队列五:下一较大值

    数据结构实验之栈与队列六:下一较大值 Time Limit: 150 ms Memory Limit: 8000 KiB Problem Description 对于包含n(1<=n<=1 ...

  8. SDUT-2134_数据结构实验之栈与队列四:括号匹配

    数据结构实验之栈与队列四:括号匹配 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给你一串字符,不超过50个字符,可能 ...

  9. SDUT-2133_数据结构实验之栈与队列三:后缀式求值

    数据结构实验之栈与队列三:后缀式求值 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运算符的后缀表示式 ...

  10. SDUT-2131_数据结构实验之栈与队列一:进制转换

    数据结构实验之栈与队列一:进制转换 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入一个十进制非负整数,将其转换成对 ...

随机推荐

  1. Linux 命令后台运行

    写这个随笔主要是每次Deepin用shadowsocks的时候总需要命令行启动,然后一个终端就一直开着总是点错了就给关了. (不知道为什么我的Deepin的shadowsocks-qt5总是连接不上的 ...

  2. windows如何关闭指定端口

    关闭windows中被占用的端口,比如我们常见的8080端口被占用了 1.查找端口的PID netstat -aon|findstr "8080" 如图 PID为3888 2.关闭 ...

  3. POJ-3669 Meteor Shower---BFS+预处理

    题目链接: https://vjudge.net/problem/POJ-3669 题目大意: 巨大流星雨即将袭来.每个流星会对击中的地方以及周围(上下左右四格)造成破坏.Bessie开始时位于(0, ...

  4. 详解 CSS 居中布局技巧

    水平居中元素: 通用方法,元素的宽高未知 方式一:CSS3 transform .parent { position: relative; } .child { position: absolute; ...

  5. 在控制台中 使用memcache

    控制台的代码 在memcache 中查询 hans,结果显示如下 :

  6. Vuex基础-Mutation

    借助官网的一张图,更改 Vuex 的 store 中的状态的唯一方法是提交 mutation.不可以直接对其进行赋值改变.需要注意的是,mutations只能做一些同步的操作. ​​​ 代码结构: ​ ...

  7. iphone应用程序生命周期浅析

    做iphone开发有必要知道iphone程序的生命周期,说白点就是当点击程序图标启动程序开始到退出程序整个使用运行过程中底下的代码都发生了什么,只有理解生命周期,有利于我们开发人员开发出更棒的应用 接 ...

  8. 开发SDK注意事项

    1. 修改类别文件名及类别方法. 开发SDK时通常会用到比较多的第三方的类别方法, 这样的话, 开发者在使用你的SDK时, 因为他可能也会加一些第三方的开源库, 比如都使用了NSString的md5类 ...

  9. centos7部署harbor

    官网 https://github.com/goharbor/harbor 1.升级系统内核 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrep ...

  10. 内置函数系列之 map

    map(映射函数)语法: map(函数,可迭代对象) 可以对可迭代对象中的每一个元素,分别执行函数里的操作 # 1.计算每个元素的平方 lst = [1,2,3,4,5] lst_new = map( ...