两个队列实现一个栈

队列的特点是先入先出,栈的特点是先入后出

思路:

假设入栈元素为:a->b>c,则出栈顺序为c->b->a

入栈

将元素a,b,c入栈,选择任意一个队列。入队列q1,此时q2是为空

出栈

1)将c出栈,先将a出队列q1,入队列q2。再将b出队列q1,入队列q2。此时q1中只有c,q2中有a,b。将c出队列删除,即出栈了

如果此时有元素d入栈了,则将d入非空队列q2。下次出栈便会先出栈了。

2)将b出栈,先将a出队列q2,入队列q1,此时q2中剩下b,q1中剩下a。将b出队列删除即将b出栈了。

如果此时有元素d入栈了,则将d入非空队列q1。下次出栈便会先出栈了。

3)将a出栈,直接将a出队列q1删除即可。

总结:

入栈,需要判断队列是否为空,先压入非空队列

出栈,需要判断其中一个队列是否为空,对非空队列进行出队列,对空队列进行入队列,直到非空队列就剩下一个元素,弹出,便是需要出栈的元素



实现代码如下:

template<typename T>class CStack
{
public:
	CStack(void);
	~CStack(void);
	void appendTail(const T& node);
	T deleteHead();
private:
	queue<T> q1;
	queue<T> q2;
}

template<typename T> void CStack<T>::appendTail(const T& element)
{
	if(!q1.empty())
    {
		ql.push(element);
	}
	else
	{
		q2.push(element);
	}
	
}

template<typename T>T CStack<T>::deleteHead()
{
	if(q1.empty())
	{
		while(q2.size()>1)
		{
			T& data=q2.front();
			q1.push(data);
			q2.pop();
		}
		head=q2.front();
		q2.pop();
	}
	else
	{
		while(q1.size()>1)
		{
			T& data=q1.front();
			q2.push(data);
			q1.pop();
		}
		head=q1.front();
		q1.pop();
		
	}
	return head;
	
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值