如何用Stack写出Queue类

前两天去面试,被问到给一个给定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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值