前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >栈和队列的C++实现

栈和队列的C++实现

作者头像
狼啸风云
修改2022-09-02 21:19:00
7120
修改2022-09-02 21:19:00
举报
文章被收录于专栏:计算机视觉理论及其实现

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

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

代码语言:javascript
复制
k=(k+1)%maxn;

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

代码语言:javascript
复制
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
复制
 // 假设储存的信息类型是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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档