面向对象的整型栈编程(双队列模拟)

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 {}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值