《数据结构》C++代码 栈与队列

线性表中,先进先出的叫队列,先进后出的叫栈。队列常用于BFS,而在函数递归层数过高时,需要手动实现递归过程,这时候便需要写一个“手动栈”。
有时候,我们会有大量数据频繁出入队列,但同时存在其内的元素却不多,此时需要写“循环队列”。其代码并不难,但里面下标递增的语句值得斟酌一下。

k=(k+1)%maxn;

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

  1. i=(i== maxn-1)?0:(i+1);
  2. if(i== maxn-1) i=0; else ++i;
  3. ++i; if(i== maxn) i=0;
  4. ++i; i=(i==maxn)?0:i;
  5. i=(i+1)%maxn;

到codeblocks本身的误差,我单单除去这条语句,将代码其余部分在codeblocks下的运行,依旧5次取平均,时间为:0.015s。
  因此,算入误差可以发现,前两条语句最快,第三条也不错,第四条较慢,最后一条用了3倍的时间。故而我的代码中采用了第一行的写法,建议大家尽量采用前三行的写法。
下面给出代码:

// 假设储存的信息类型是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
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值