c++实验3
面向对象的整形栈编程(双队列模拟)
队列实现程序
面向对象的整形队列(父类)
栈实现程序(子类)
#pragma once
#include"队列父类"//请自行替换
class STACK : public QUEUE {
QUEUE q;
public:
STACK(int m); //初始化栈:最多存放2m-2个元素
STACK(const STACK& s); //用栈s深拷贝初始化栈
STACK(STACK&& s)noexcept; //用栈s移动拷贝初始化栈
int size()const noexcept; //返回栈的容量即2m
operator int() const noexcept; //返回栈的实际元素个数
STACK& operator<<(int e); //将e入栈,并返回当前栈
STACK& operator>>(int& e); //出栈到e,并返回当前栈
STACK& operator=(const STACK& s); //深拷贝赋值并返回被赋值栈
STACK& operator=(STACK&& s)noexcept;//移动赋值并返回被赋值栈
char* print(char* b)const noexcept; //从栈底到栈顶打印栈元素
~STACK()noexcept; //销毁栈
};
STACK::STACK(int m):q(m),QUEUE(m){}
STACK::STACK(const STACK& s):q(s.q),QUEUE(s){}
STACK::STACK(STACK&& s)noexcept :q((QUEUE &&)s.q),QUEUE((QUEUE &&)s){}
int STACK::size()const noexcept {
return 2 * q.size();
}
STACK::operator int() const noexcept {
int first, second;
first = q.QUEUE::operator int();
second = QUEUE::operator int();
return first+second;
}
STACK& STACK::operator<<(int e){
if (this->operator int() >= this->size() - 2) {
throw"STACK is full!";
return *this;
}
if (this->QUEUE::operator int()>=this->QUEUE::size()-1) {
//如果this 满。直接插入q
q.QUEUE::operator<<(e);
return *this;
}
this->QUEUE::operator <<(e);
return *this;
}
STACK& STACK::operator>>(int& e) {
QUEUE* live = this;
if (this->operator int() == 0) {
throw"STACK is empty!";
return *this;
}
if (q.QUEUE::operator int() != 0) {
live = &q;
}
for (int i = 0; i < live->QUEUE::operator int()-1; i++) {
int temp;
live->QUEUE::operator>>(temp);
live->QUEUE::operator<<(temp);
}
live->QUEUE::operator>>(e);
return *this;
}
STACK& STACK::operator=(const STACK& s) {
this->QUEUE::operator=(s);
q.QUEUE::operator=(s.q);
return *this;
}
STACK& STACK::operator=(STACK&& s)noexcept {
this->QUEUE::operator=((QUEUE&&)s);
q.QUEUE::operator=((QUEUE&&)s.q);
return *this;
}
char* STACK::print(char* b)const noexcept {
if (this->operator int() == 0) {
b[0] = '\0';
return b;
}
if (q.QUEUE::operator int() == 0) {
this->QUEUE::print(b);
return b;
}
else if(this->QUEUE::operator int() == 0){
q.QUEUE::print(b);
return b;
}
else if (q.QUEUE::size() - 1 <= q.QUEUE::operator int()) {
char s[1024];
q.QUEUE::print(s);
this->QUEUE::print(b);
sprintf(b + strlen(b), ",");
strcat(b, s);
return b;
}
else {
char s[1024];
q.QUEUE::print(b);
this->QUEUE::print(s);
sprintf(b + strlen(b), ",");
strcat(b, s);
return b;
}
}
STACK::~STACK()noexcept {}