<8> 其实,队列也可以这么来替代。

两个栈来代替一个队列,一个栈正常存储数据,另一个栈在执行top()时候存储“从第一个栈中去取出来的数据”,并将第二个栈的顶端数据弹出即可。

#include <iostream>
#include <malloc.h>
#include <algorithm>
#include <functional>



//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
// 基类

class UnCopyable{
public:
	UnCopyable();
	~UnCopyable();

private:
	UnCopyable(const UnCopyable& e);
	UnCopyable& operator=(const UnCopyable& e);
};

UnCopyable::UnCopyable(){

}

UnCopyable::~UnCopyable(){

}

UnCopyable::UnCopyable(const UnCopyable& e) {
	*this = e;
}
UnCopyable& UnCopyable::operator=(const UnCopyable&) {
	return *this;
}


// ------------------------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------------------
// 基类UnCopyable是为了阻止MyQueue可以被赋值和拷贝

class MyQueue : private UnCopyable {

public:
	MyQueue( unsigned int size ) 
		: m_Top( -1 ), m_Top_2(-1), 
		  m_MAX( -100000 ), m_Min( 100000 )
	{
		m_VAPACITY = size;
		m_Data = (int*)malloc(sizeof(int)*m_VAPACITY);
		m_Data_2 = (int*)malloc(sizeof(int)*m_VAPACITY);
	}
	~MyQueue();
private:
	int *m_Data;													//	存取值的数组
	int *m_Data_2;													//	存取值的数组
	int  m_Top;														//  栈顶索引
	int  m_Top_2;													//  栈顶索引
	int  m_MAX;														//  数组中的最大值
	int  m_Min;														//  数组中的最小值
	unsigned int m_VAPACITY;										//  栈的容量
public:
	enum QueueSort
	{
		less,
		greater
	};

	unsigned int QueueVapacity() const;								//  栈的容量
	unsigned int QueueMax() const;									//  栈最大
	unsigned int QueueMin() const;									//  栈最小
public:
	bool isEmpty();													//  判断栈是否为空
	bool isFull();													//  判断栈是否满了
	bool isEmpty_2();												//  判断栈是否为空
	bool isFull_2();												//  判断栈是否满了
	void pop();														//  出栈(删除栈顶元素)
	void push( int value );											//  入栈
	void pop_2();													//  出栈(删除栈顶元素)
	void push_2(int value);											//  入栈
	unsigned int Top();												//  取值
	unsigned int Top_2();
	unsigned int Tops();
	int max();														//  栈中最大值(版本1)
	int min();														//  栈中最小值(版本1)
	int max1();														//  栈中最大值(版本2)
	int min1();														//  栈中最小值(版本2)
	void QueueOrder( QueueSort Strategy );							//  将栈中的元素排序
};


unsigned int MyQueue::QueueVapacity() const {
	return m_VAPACITY;
}

unsigned int MyQueue::QueueMax() const {
	return m_MAX;
}

unsigned int MyQueue::QueueMin() const {
	return m_Min;
}

bool MyQueue::isEmpty(){
	return m_Top == -1;
}

bool MyQueue::isEmpty_2() {
	return m_Top_2 == -1;
}

bool MyQueue::isFull() {
	return m_Top == m_VAPACITY - 1;
}

bool MyQueue::isFull_2() {
	return m_Top_2 == m_VAPACITY - 1;
}

void MyQueue::pop() {
	try{
		 if (!isEmpty()) {
			 m_Top--;
		 }
		 else{
			 std::cout << "the Queue is empty." << std::endl;
		 }
	}
	catch (const std::exception& e){
		std::cout << e.what() << std::endl;
	}	
}

void MyQueue::push( int value ) {
	try{
		if (!isFull()) {
			m_Data[m_Top++] = value;
		}
		else{
			std::cout << "the Queue is full." << std::endl;
		}
	}
	catch (const std::exception& e){
		std::cout << e.what() << std::endl;
	}
}

void MyQueue::pop_2() {
	try {
		if (!isEmpty_2()) {
			m_Top_2--;
		}
		else {
			std::cout << "the Queue is empty." << std::endl;
		}
	}
	catch (const std::exception& e) {
		std::cout << e.what() << std::endl;
	}
}

void MyQueue::push_2(int value) {
	try {
		if (!isFull_2()) {
			m_Data_2[m_Top_2++] = value;
		}
		else {
			std::cout << "the Queue is full." << std::endl;
		}
	}
	catch (const std::exception& e) {
		std::cout << e.what() << std::endl;
	}
}

unsigned int MyQueue::Top() {
	if (!isEmpty()) {
		int Temp = m_Data[m_Top];
		m_Top--;
		return Temp;
	}
}

unsigned int MyQueue::Top_2() {
	if (!isEmpty()) {
		int Temp = m_Data_2[m_Top_2];
		m_Top_2--;
		return Temp;
	}
}

unsigned int MyQueue::Tops() {
	if (!isEmpty_2()) {
		
		// 第一步(判断m_data_2不是空,直接将m_data_2的顶端数据倒出)
		return Top_2();
	}
	else{

		// 第二步(判断m_data_2是空,直接将m_data_1的顶端数据全部数据倒出到m_data_2里,然后将m_data_2的顶端数据倒出)
		while ( !isEmpty() ){
			push_2(Top());
		}

		return Top_2();
	}
}

int MyQueue::max(){
	if (!isEmpty()) {
		std::sort(m_Data, m_Data + m_Top + 1, std::greater<int>());
		return m_Data[0];
	}
}

int MyQueue::min() {
	if (!isEmpty()) {
		std::sort(m_Data, m_Data + m_Top + 1, std::less<int>());
		return m_Data[0];
	}
}

int MyQueue::max1() {
	if (!isEmpty()) {
		m_MAX = m_Data[0];
		for ( size_t i = 0; i <= m_Top; i++ ){
			if (m_Data[i] > m_MAX) {
				m_MAX = m_Data[i];
			}
		}

		return m_MAX;
	}

	return 0x1000000;
}

void MyQueue::QueueOrder( QueueSort Strategy ) {
	switch (Strategy){
			case QueueSort::greater:	
				std::sort(m_Data, m_Data + m_Top + 1, std::greater<int>());
			case QueueSort::less:
				std::sort(m_Data, m_Data + m_Top + 1, std::less<int>());
			default:
				break;
	}
}

int MyQueue::min1() {
	if (!isEmpty()) {
		m_Min = m_Data[0];
		for ( size_t i = 0; i <= m_Top; i++ ) {
			if (m_Data[i] < m_Min) {
				m_MAX = m_Data[i];
			}
		}
	}

	return 0x1000000;
}

MyQueue::~MyQueue(){

}

int main() {

	MyQueue Q(3);
	Q.push(1);
	Q.push(2);
	Q.push(3);

	std::cout << Q.Tops() << std::endl;
	std::cin.get();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值