两个队列实现一个桟

题目:用两个队列实现一个栈

现有两个队列q1与q2,必须保证q1,q2中有一个始终为空,

入栈:如果q1与q2都为空,那么我们选择q1入栈也就是入队列,比如q1入栈 1 2 3 4 ;

出栈:后进先出那么4要出栈。但是q1是一个队列,先进先出,那么 先让1 2 3出队列q1,然后q2入队列1 2 3,q1中此时剩余4,把4出对列达到出栈的效果;

这个时候如果我们又加入一个元素5,那么我们应该把5放到q1还是q2,因为现在q2中有 1 2 3,要保证q1,q2中有一个为空,所以要把5放入到q2;

依次循环以上出桟入栈。

入栈过程中:

如果q1与q2都为空,那么往q1中插入元素(优先q1)

如果q1不为空,那么往q1中插入元素(必须保证q1,q2中有一个始终为空,所以q2为空

如果q2不为空,那么往q2中插入元素(必须保证q1,q2中有一个始终为空,所以q1为空


#include<queue>
#include<iostream>

using namespace std;

template<class T>
class Stack
{
private:
	queue<T> q1;
	queue<T> q2;
public:
	Stack(){}
	void my_push(const T&);
	T& my_pop();
};

template<class T>
void Stack<T>::my_push(const T& elem)
{
	//1.必须保证q1与q2有一个队列为空,如果两个都为空,则向q1插入元素,
	//2.向不为空的队列插入元素

	if(q1.size()==0&&q2.size()==0)//如果q1与q2都为空,那么往q1中插入元素
	{
		q1.push(elem);
	}
	else if(q1.size()>0)//如果q1不为空,那么往q1中插入元素
	{
		q1.push(elem);
	}
	else                //q2不为空,往q2中插入元素
	{
		q2.push(elem);
	}
}

template<class T>
T& Stack<T>::my_pop()
{
	T ret;
	if(q1.size()>0)//此处就要让q1依次出队列,进入空队列q2,得到q1最后一个元素
	{
		while(q1.size()!=1)
		{
			q2.push(q1.front());
			q1.pop();
		}
		ret=q1.front();//出桟的值
		q1.pop();      //q1为空了
	}
	else          //此处就要让q2依次出队列,进入空队列q1,得到q2最后一个元素  
	{
		while(q2.size()!=1)
		{
			q1.push(q2.front());
			q2.pop();
		}
		ret=q2.front();//出桟的值
		q2.pop();      //q2为空了
	}
	return ret;
}

int main()
{
	Stack<int> s;

	s.my_push(1);
	s.my_push(2);

	cout<<s.my_pop()<<" ";

	s.my_push(0);

	cout<<s.my_pop()<<" ";

	cout<<s.my_pop()<<" ";

	s.my_push(5);

	cout<<s.my_pop()<<endl;

	system("pause");
	return 0;
}

运行结果:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值