面试宝典(第三版),178页,面试例题四
以下的思路是目前看到最优的。
思路:s1是入栈的,s2是出栈的。
入队列时:直接压入s1即可
出队列时:如果s2不为空,把s2中的栈顶元素直接弹出;否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素
用到了STL模板库。
#include <stack>
#include <iostream>
using namespace std;
//利用两个栈,实现入队操作
//stack s1,负责入队操作,stack s2,负责出队操作
int EnQueue(stack<int> &s1,int data)
{
s1.push(data);
return 0;
}
//出队操作
int DeQueue(stack<int> &s1,stack<int> &s2)
{
int p;//用于存储栈顶元素
//当放回false时,说明不为空
//当s2不为空时,先弹出s2中的元素
if (false==s2.empty())
{
int &data=s2.top();
p=data;
cout<<"弹出元素为"<<p<<endl;
s2.pop();
return 0;
}
//当s2中为空时,把s1中的元素全都压到s2中,再弹出s2中的元素
if (true==s1.empty())
{
cout<<"There is no data in the Queue!"<<endl;
}
while (false==s1.empty())
{
int &data=s1.top();
p=data;
s2.push(p);
s1.pop();
}
int &data=s2.top();
p=data;
cout<<"弹出元素为"<<p<<endl;
s2.pop();
return 0;
}
int main()
{
stack<int> s1,s2;
for (int i=1;i<=10;i++)
{
EnQueue(s1,i);
}
for (int i=1;i<=10;i++)
{
DeQueue(s1,s2);
}
return 0;
}