7 两个栈模拟队列,两个队列模拟栈

利用两个栈模拟队列

stack1,stack2

首先向stack1当中放入数据,如果需要输出数据,从stack2中delete数据,如果stack2为空,就把stack1中数据导入stack2


<span style="font-size:14px;">#include "static.h"
#include <iostream>
#include <stack>

template<typename T> 
class CQuue
{
public:
	CQuue(){};
	~CQuue(){};
	void appendTail(const T &node);
	T deleteHead();
private:
	stack<T> m_stack1;
	stack<T> m_stack2; //<存入数据的时候放入到stack1当中,取数据从stack2中取出,如果stack2为空,将stack1中数据转入stack2当中
};
template<typename T>
void CQuue<T>::appendTail(const T &node)
{
	m_stack1.push(node);
}

template<typename T> 
T CQuue<T>::deleteHead()
{
	if (m_stack2.empty())
	{
		if (m_stack1.empty())
		{
			printf("There is no data in stack");
			exit(1);
		}
		while(!m_stack1.empty())
		{
			m_stack2.push(m_stack1.top());
			m_stack1.pop();
		}
	}
	T valueTemp = m_stack2.top();
	m_stack2.pop();
	printf("%d ",valueTemp);
	return valueTemp;
}
int main()
{  
	CQuue<int> cqueue;
	cqueue.appendTail(1);
	cqueue.appendTail(3);
	cqueue.deleteHead();
	cqueue.appendTail(5);
	cqueue.appendTail(7);
	cqueue.deleteHead();
	cqueue.deleteHead();
	cqueue.deleteHead();
	return 0;
}</span>

两个队列模拟栈

这里用的方法和书中提到的方法不太一样,但是大致意思都是相同的,但是书中的方法会减少判断语句

两个队列,每次放入数据将数据放入一个空的队列当中,同时将另一个队列中的数据copy到当前这个队列当中,又保持一个空队列

输出数据的时候就从非空队列中输出

但是这样的方法每输入一个数据就需要copy一次,也比较麻烦

在书中,是每一次输出数据的时候需要将前面的数据copy到另一个queue当中

<span style="font-size:14px;">#include "static.h"
#include <iostream>
#include <queue>

template<typename T>
class CStack
{
public:
	CStack(){};
	~CStack(){};
	void appendTail(const T& node);
	T deleteHead();
private:
	queue<T> m_queue1;
	queue<T> m_queue2; //<存入数据的时候放入到m_queue1当中,然后再将数据都导入进queue2当中,然后每次添加数据放入一个空的queue当中
};
template<typename T>
void CStack<T>::appendTail(const T& node)
{
	if (m_queue1.size()== 0)
	{
		m_queue1.push(node);
		while (!m_queue2.empty())
		{
			m_queue1.push(m_queue2.front());
			m_queue2.pop();
		}
	}
	else
	{
		m_queue2.push(node);
		while (!m_queue1.empty())
		{
			m_queue2.push(m_queue1.front());
			m_queue1.pop();
		}
	}
}
template<typename T>
T CStack<T>::deleteHead()
{
	T tempValue;
	if (m_queue1.empty() && m_queue2.empty())
	{
		printf("the stack is empty");
		exit(1);
	}
	if (m_queue1.size()>0)
	{
		tempValue = m_queue1.front();
		m_queue1.pop();
	}
	else
	{
		tempValue = m_queue2.front();
		m_queue2.pop();
	}
	printf("%d ",tempValue);
	return tempValue;
}
int main()
{  
	CStack<int> cstack;
	cstack.appendTail(1);
	cstack.deleteHead();
	cstack.appendTail(3);
	cstack.appendTail(5);
	cstack.appendTail(7);
	cstack.deleteHead();
	cstack.deleteHead();
	cstack.deleteHead();
	return 0;
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值