面向对象的整形队列编程

c++实验2

面向对象的整形队列编程

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
class QUEUE {
    int* const  elems;	//elems申请内存用于存放队列的元素
    const  int  max;	//elems申请的最大元素个数为max
    int   head, tail;	 	//队列头head和尾tail,队空head=tail;初始head=tail=0
public:
    QUEUE(int m);		//初始化队列:最多申请m个元素
    QUEUE(const QUEUE& q); 			//用q深拷贝初始化队列
    QUEUE(QUEUE&& q)noexcept;		//用q移动初始化队列
    virtual operator int() const noexcept;	//返回队列的实际元素个数
    virtual int size() const noexcept;		//返回队列申请的最大元素个数max
    virtual QUEUE& operator<<(int e);  	//将e入队列尾部,并返回当前队列
    virtual QUEUE& operator>>(int& e); 	//从队首出元素到e,并返回当前队列
    virtual QUEUE& operator=(const QUEUE& q);//深拷贝赋值并返回被赋值队列
    virtual QUEUE& operator=(QUEUE&& q)noexcept;//移动赋值并返回被赋值队列
    virtual char* print(char* s) const noexcept;//打印队列至s并返回s
    virtual ~QUEUE();	 					//销毁当前队列
};
QUEUE::QUEUE(int m):max(m),head(0),tail(0),elems(new int [m]){}

QUEUE::QUEUE(const QUEUE& q) : max(q.max), head(q.head), tail(q.tail), elems() {
    (int *&)elems = new int[max];
    for (int i = 0; i < max; i++) {
        elems[i] = q.elems[i];
    }
}

QUEUE::QUEUE(QUEUE&& q)noexcept :max(q.max), head(q.head), tail(q.tail),elems(){
    if (this == &q) {
        throw"Can't init an alive QUEUE!";
        return;
    }
    (int*&)this->elems = q.elems;
    //处理源队列q
    (int *&)q.elems = 0;
    (int&)q.max = 0;
    q.head = q.tail = 0;
}

QUEUE::operator int() const noexcept {
    if (elems == nullptr)return NULL;//防止出现已经析构的队列访问number
    return (tail - head + max) % max;
}

int QUEUE::size() const noexcept {
    return max;
}

QUEUE& QUEUE::operator<<(int e) {
    if ((tail + 1) % max == head) {
        throw"QUEUE is full!";
        return *this;
    }
    elems[tail] = e;
    tail = (tail + 1) % max;
    //改变的时候都要确保不会出现访问到数组外
    return *this;
}

QUEUE& QUEUE::operator>>(int& e) {
    if (head == tail) {
        throw"QUEUE is empty!";
        return *this;
    }
    e = elems[head];
    head = (head + 1) % max;
    return *this;
}

QUEUE& QUEUE::operator=(const QUEUE& q) {
    head = q.head;
    tail = q.tail;
    (int &)max = q.max;
    for (int i = 0; i < max; i++) {
        elems[i] = q.elems[i];
    }
    return *this;
}

QUEUE& QUEUE::operator=(QUEUE&& q)noexcept {
    //移动语义
    if (this == &q)return *this;
    if (elems != nullptr)delete []elems;
    (int*&)(elems) = q.elems;
    (int&)(max) = q.max;
    head = q.head;
    tail = q.tail;
    (int*&)(q.elems) = nullptr;
    (int&)(q.max) = 0;
    q.head = q.tail = 0;
    return *this;
}

char* QUEUE::print(char* s)const noexcept {
    if (max == 0) {
        return nullptr;
    }
    char* q = s;
    int i = head;
    while (i != tail) {
        if (i == head)sprintf(q, "%d", elems[i]);
        else sprintf(q + strlen(q), "%d", elems[i]);//向s字符串中打印元素
        if (i != (tail - 1) % max)
            sprintf(q + strlen(q), ",");//向s字符串中打印逗号
        i++;
        if (i == max) i = 0;//下标回传
    }
    return s;
}

QUEUE::~QUEUE() {
    if (elems != nullptr) {
        delete[]elems;
        (int*&)elems = nullptr;
        (int&)max = 0;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值