用两个栈实现队列
题目描述:用两个栈实现一个队列,满足先进先出的特点。
解题思路:将所有的元素都插入到栈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;
}