队列

先来一个计蒜客原版的队列实现(侵权则删)

#include <iostream>
#include <cassert>
using namespace std;
class Queue {
private:
    int *data;
    int head, tail, length;
public:
    Queue(int length_input) {
        data = new int[length_input];
        length = length_input;
        head = 0;
        tail = -1;
    }
    ~Queue() {
        delete[] data;
    }
    void push(int element) {
        if (tail + 1 < length) {
            tail++;
            data[tail] = element;
        }
    }
    void output() {
        for (int i = head; i <= tail; i++) {
            cout << data[i] << " ";
        }
        cout << endl;
    }

    int front(){
        assert(head<=tail);
        return data[head];
    }

    void pop(){
        assert(head<=tail);
        head++;
    }

};
int main() {
    Queue queue(100);
    for (int i = 1; i <= 10; i++) {
        queue.push(i);
    }
    queue.output();
    cout<<queue.front()<<endl;

    queue.pop();
    queue.output();
    return 0;
}

然后我稍微改了一下,加上了自己的理解(PS: assert()的效果very nice。。。):

#include <iostream>
#include <stdlib.h>
#include <cassert>

using namespace std;

class Queue
{
private:
    int length;
    int head;
    int tail;
    int *data;
public:
    Queue(int _length){
        length = _length;
        data = new int[length];
        head = 0;
        /*tail表示队列最后一名,所以在构造函数中置*/
        tail = -1;
    }
    ~Queue(){
        delete []data;
    }

    /*注意为什么要tail+1小于length呢?因为tail初始值为-1而length最小为0*/
    /*当length等于0时,此时不能建立这个队列*/
    /*相当于队列元素下标从0开始,且由于if条件的限制,只能到length-1,但是实际长度仍然为length*/
    void myPush(int element){
        if(tail+1 < length){
            tail++;
            data[tail] = element;
        }
        else
            cout<<"队列已满!!!"<<endl;
    }

    /*assert用法详情百度*/
    /*用head来表示队首,pop出一个后便加一*/
    /*没必要每次pop都释放对应的内存,最后直接用析构函数回收整块内存*/
    void myPop(){
        if(head<=tail)
            head++;
        else
            cout<<"队列为空!!!"<<endl;
    }

    /*由于pop操作可能导致队列为空,所以必须判断head是否小于等于tail*/
    int myFront(){
        /*若队列为空,那么head大于tail*/
        assert(head<=tail);
        return data[head];
    }

    void myOutput(){
        if(head>tail){
            cout<<"队列已空,无输出!!!"<<endl;
            return;
        }
        for(int i=head; i<=tail; i++){
            cout<<data[i]<<" ";
        }
        cout<<endl;
    }
};

int main()
{
    Queue lrhQueue(10);
    /*这里的i的最大值大于队列长度10*/
    for(int i=0; i<12; i++)
        lrhQueue.myPush(i+1);
    cout<<"建队成功后输出为:"<<endl;
    lrhQueue.myOutput();
    cout<<"队首元素是:"<<lrhQueue.myFront()<<endl;
    cout<<"-------------------\n\n\n\n";

    for(int i=0; i<9; i++){
        cout<<"第"<<i+1<<"次pop()后的队列为:"<<endl;
        lrhQueue.myPop();
        lrhQueue.myOutput();
        cout<<"此时队首元素是:"<<lrhQueue.myFront()<<endl;
        cout<<"-------------------\n\n\n\n";
    }

    cout<<"此时队列还剩下一个元素,尝试继续\n\n";
    lrhQueue.myPop();
    cout<<"assert要起作用了,boom!!!\n\n";
    cout<<"队首元素是:"<<lrhQueue.myFront()<<endl;
    cout<<"-------------------\n\n\n\n";

    system("pause");
    return 0;
}

如有不对,希望能够指出,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值