队列2-循环队列

Part 1:循环队列

我们来看下上次我们写下的Queue

struct Queue{
    int que[1000];     //最大容纳1000个元素
    int head = 0;      //队列的第一个元素
    int tail = 0;      //队列的最后一个元素
    void push(int x){ que[tail++]=x; }  //增加一个
    void pop(){ head++; }      //弹出第一个
    bool empty(){ return tail-head; }     //是否为空
    int num(){ return tail-head; }        //返回有多少个元素
    int getHead(){ return que[head]; }    //获取第一个元素
};

现在我们增加一个功能,获取第i个元素。

int getNum(int x){
}

好的,开始在里边填充东西:

int getNum(int x){
    return que[x];
}

但显然,如果你的x比较大的话,你会输出什么?

那就想个办法,我们可以给他来个循环队列,也就是说,如果你的x太大了,我们就把他重新归到head,再来确定元素,就像这样:

那就开始吧!

int getNum(int x){
    return que[x%(head-tall)];
}

但是,如果这个队列是空的话,head-tail是0的话,会有error,我们再加一个特判:

int getNum(int x){
    return !(head-tall)?-1:que[x%(head-tall)];
}

如果队列为空,返回一个-1。顺便咱把getHead()也重写一下:

int getHead(){
    return !(head-tall)?-1:que[head];
}

好的,循环队列就实现啦~

posted @ 2020-03-18 12:28  SD!LTF  阅读(159)  评论(0编辑  收藏  举报