两个栈实现一个队列&两个队列实现一个栈

这两个题的思路比较相似。

栈的特点是“先进后出”,队列的特点是“先进先出”。

不要怕!用两个栈实现一个队列很简单大笑,push的时候我们都push到stack_1里面,当我们要pop的时候,要找到最先push进去的,此时stack_2为空,我们取stack_1的top元素,

再将top元素push到stack_2中,然后将stack_1 pop一次直到stack_1剩下最后一个元素,这个就是最先push进去的,我们把它pop掉就可以了,同理,我们求queue的front元素时,

用的方法和pop相同。主要思想就是这样,下来你们看一下代码,我已经测试过了大笑

class My_Queue
{
public:
	My_Queue()
	{
		_size=0;
	}
	bool empty()
	{
		if(_size==0)
			return true;
		else
			return false;
	}
	void push(int data)//不论什么情况我们都把它push到第一个栈里
	{
		_s1.push(data);
		_size++;
	}
	void pop()
	{
		int tmp=0;
		if(_s1.size()==0&&_s2.size()==0)
		{
			printf("queue is empty!\n");
			return;
		}
		else
		{//pop的时候只有一种特殊情况需要处理,就是当第二个栈为空,我们要把第一个栈里的元素都push到第二个栈里,这样来实现元素顺序的翻转
			if(_s2.empty())
			{
				while(!_s1.empty())
				{
					tmp=_s1.top();
					_s2.push(tmp);
					_s1.pop();
				}
				_s2.pop();
				_size--;
			}
			else //走到这里s2一定不为空,即使s1里有元素,那也是之后push进去的,而且s2里的top就是先push进去的
			{
				_s2.pop();
				_size--;
			}
		}
	}
	int top()
	{
		assert((!_s1.empty())||(!_s2.empty()));
		
			int tmp=0;
			if(_s1.empty())
				return _s2.top();
			if(_s2.empty())
			{
				while(!_s1.empty())
				{
					tmp=_s1.top();
					_s2.push(tmp);
					_s1.pop();
				}
			}
			return _s2.top();
	}
	int size()
	{
		return _size;
	}
	
	~My_Queue()
	{
		_size=0;
	}
private:
	stack<int> _s1;
	stack<int> _s2;
	int _size;
};

两个队列实现一个栈很类似
class My_Stack
{
public:
	My_Stack()
	{
		_size=0;
	}
	bool empty()
	{
		if(_size==0)
			return true;
		else
			return false;
	}
	void push(int data)
	{
		/*if(_q1.empty())
		{
			_q2.push(data);
		}
		else 
		{
			_q1.push(data);
		}
		_size++;*/

		_q1.push(data);
		_size++;
	}
	void pop()
	{
		if(_q1.empty()&&_q2.empty())
			return;
		//注释的这也是一种方法if(_q1.empty())
		//{
		//	int tmp=0;
		//	while(_q2.size()!=1)
		//	{
		//		tmp=_q2.front();
		//		_q1.push(tmp);
		//		_q2.pop();
		//	}
		//	_q2.pop();
		//}
		//else//_q2为空
		//{
		//	int tmp=0;
		//	while(_q1.size()!=1)
		//	{
		//		tmp=_q1.front();
		//		_q2.push(tmp);
		//		_q1.pop();
		//	}
		//	_q1.pop();
		//}
		//_size--;
		if(_q1.empty())//_q1为空且_q2不为空
		{
			int tmp=0;
			while(_q2.size()!=1)
			{
				tmp=_q2.front();
				_q1.push(tmp);
				_q2.pop();
			}
			_q2.pop();
		}
		
		else//_q1不为空,进行的处理和上面刚好相反
		{
			int tmp=0;
			while(_q1.size()!=1)
			{
				tmp=_q1.front();
				_q2.push(tmp);
				_q1.pop();
			}
			_q1.pop();
		}
		_size--;
	}
	int front()
	{
		assert((!_q1.empty())||(!_q2.empty()));
		if(_q1.empty())
		{
			int tmp=0;
			while(_q2.size()!=1)
			{
				tmp=_q2.front();
				_q1.push(tmp);
				_q2.pop();
			}
			_q1.push(_q2.front());
			tmp=_q2.front();
			_q2.pop();
			return tmp;
		}
		else//_q2为空
		{
			int tmp=0;
			while(_q1.size()!=1)
			{
				tmp=_q1.front();
				_q2.push(tmp);
				_q1.pop();
			}
			_q2.push(_q1.front());
			tmp= _q1.front();
			_q1.pop();
			return tmp;
		}
			
	}		
	int size()
	{
		return _size;
	}
	~My_Stack()
	{}
private:
	queue<int> _q1;
	queue<int> _q2;

	int _size;
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值