前两天去面试,被问到给一个给定class Stack{ push();pop();isempty()},问如何用这个类写出class Queue{ enqueue();dequeue },因为stack是LIFO而queue是FIFO,当时是给问住了,没能答上来,现在贴出答案,加深记忆哈
使用stack要 #include <stack>
使用list要 #include <list>
使用copy要 #include <algorithm>
题目:
用两个栈模拟一个队列。
初见这个题目,也许会说:"栈怎么能模拟队列呢?",其实是可以的。
这个题目非常考验人的逻辑思维和空间想象能力,认真掌握这个题目,将很有助于理解栈这种重要的数据结构。
下面直接给出STL的stack模拟的队列,省的我再一个一个写栈的基本操作函数。
我用了list来真实的动态的反映2个栈在入队列和出队列后的内部状态。
C/C++ code
stack<int> s1,s2; //s1只负责入队列,s2只负责出队列
bool Queue_Empty(stack<int> &s1,stack<int> &s2)
{
return (s1.empty() && s2.empty())?true:false;
}
bool EnQueue(stack<int> &s1,stack<int> &s2,int e)
{
while(!s2.empty())
{
s1.push(s2.top()); // s2->s1
s2.pop();
}
s1.push(e);
return true;
}
bool DeQueue(stack<int> &s1,stack<int> &s2,int &e)
{
if(Queue_Empty(s1,s2))
return false;
while(!s1.empty())
{
s2.push(s1.top()); // s1->s2
s1.pop();
}
e=s2.top();
s2.pop();
return true;
}
下面是ShowTwoStack函数和主函数:
C/C++ code
void ShowTwoStack(stack<int> s1,stack<int> s2) //因为是传值,所以不会改变原来的数据
{
list<int> l;
while(!s1.empty())
{
l.insert(l.begin(),s1.top());
s1.pop();
}
cout<<"s1 base->top: ";
copy(l.begin(),l.end(),ostream_iterator<int>(cout," "));
cout<<endl;
l.clear();
while(!s2.empty())
{
l.insert(l.begin(),s2.top());
s2.pop();
}
cout<<"s2 base->top: ";
copy(l.begin(),l.end(),ostream_iterator<int>(cout," "));
cout<<endl;
}
int main()
{
for(int i=0;i<10;i++)
EnQueue(s1,s2,i);
cout<<"0~9依次入队列:"<<endl;
ShowTwoStack(s1,s2);
int e;
DeQueue(s1,s2,e);
cout<<"一个元素出了队列:"<<endl;
ShowTwoStack(s1,s2);
EnQueue(s1,s2,100);
cout<<"一个元素入了队列:"<<endl;
ShowTwoStack(s1,s2);
return 0;
}