剑指offer七、用两个栈实现队列

                                      用两个栈实现队列

题目描述:用两个栈实现一个队列,满足先进先出的特点。

解题思路:将所有的元素都插入到栈1中,如果栈2为空,则将数据都压倒栈2中,然后栈2元素依次出栈,则实现队列的先进先出,如果栈2不为空,则将元素必须一直放在栈1,直到栈2元素都为空时,才能依次出栈。

//利用两个栈模拟队列入队,全部入到栈1
void QueuePush(stack<int> &s1,stack<int> &s2,int val)
{
	s1.push(val);
}
//利用两个栈模拟队列出对,先把栈1的元素全部入到栈2,再从栈2中出一个元素
int QueuePop(stack<int> &s1,stack<int> &s2)
{
	if(s2.empty())
	{
		while(!s1.empty())
		{
			s2.push(s1.top());
			s1.pop();
		}
	}
	int tmp = s2.top();
	s2.pop();
	return tmp;
}

扩展:利用两个队列实现栈

解题思路:将元素全部都入队到队列1中,然后把队列1中的元素除了最后一个元素,都入队到队列2中,然后将队列1中的最后一个元素出队,然后再将队列2的元素全部入队到队列2中,队列2只是暂时的保存元素,然后重复上述操作,直到队列和队列2中都没有元素,则截止。

//利用两个队列模拟栈 入栈,全部入到队列1
void StackPush(deque<int> &d1,deque<int> &d2,int val)
{
	d1.push_back(val);
}
/*利用两个队列模拟栈 出栈 ,先把队列1的元素除最后一个元素外全部入到队列2,
再从队列1中出最后一个元素  ,把队列2的数据再放回队列1,队列2只是暂时保存*/
bool StackPop(deque<int> &d1,deque<int> &d2,int *val)
{
	if(d1.empty())        /*  数据存放在q1中,q1空则栈空 */
	{
		return false;
	}
	int tmp;
	while(!d1.empty())        /*  出q1的最后数据,其它数据暂存q2中*/
	{
		tmp = d1.front();
		d1.pop_front();
		d2.push_back(tmp);   
	}
	d2.pop_back();/*  最后一个出栈数据不保存到q2中*/
	*val = tmp;
	while(!d2.empty())   /*  q2只是暂存,所有数据移到q1中*/     
	{
		tmp = d2.front();
		d2.pop_front();
		d1.push_back(tmp);
	}
	return true;
}

 

猜你喜欢

转载自blog.csdn.net/ShineDays/article/details/81413282