c++实验2
面向对象的整形队列编程
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
class QUEUE {
int* const elems;
const int max;
int head, tail;
public:
QUEUE(int m);
QUEUE(const QUEUE& q);
QUEUE(QUEUE&& q)noexcept;
virtual operator int() const noexcept;
virtual int size() const noexcept;
virtual QUEUE& operator<<(int e);
virtual QUEUE& operator>>(int& e);
virtual QUEUE& operator=(const QUEUE& q);
virtual QUEUE& operator=(QUEUE&& q)noexcept;
virtual char* print(char* s) const noexcept;
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;
(int *&)q.elems = 0;
(int&)q.max = 0;
q.head = q.tail = 0;
}
QUEUE::operator int() const noexcept {
if (elems == nullptr)return NULL;
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]);
if (i != (tail - 1) % max)
sprintf(q + strlen(q), ",");
i++;
if (i == max) i = 0;
}
return s;
}
QUEUE::~QUEUE() {
if (elems != nullptr) {
delete[]elems;
(int*&)elems = nullptr;
(int&)max = 0;
}
}