两个栈实现一个队列

本文介绍了一种使用两个栈来实现队列的方法。通过将入队操作放置在一个栈中,并在出队时将该栈的元素依次转移到另一个栈,以此实现队列的先进先出特性。文中提供了一个具体的C++实现示例。
  • 问题描述:

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

  • 解法分析:

 首先题目要求用两个栈实现一个队列,那么就要先分析为什么这么做。队列的特点就像排队的“先到先得”一样,即先入队的就先出队;而栈则正好相反,特点是“后进先出”,那么问题来了怎么用“后进先出”的得到“先进先出”?

 传说中最简单通用但效率不高的方法(其实我还真没想到这么做)是,入队的时候用stack1来存储,当出队的时候,先把stack1的所有元素倒入stack2中,这个过程正好把先进入stack1的元素,变成了后进入stack2的元素;再从stack2中出栈,而此时出栈的也就是先进入stack1的元素了(即先进队的元素)。当出队操作结束的时候,再把stack2的元素倒回stack1,变回原来的顺序。
 细思极恐啊,这个方法确实简单无脑,可问题在于当栈内元素很多的时候,出入栈的操作次数变得极其多。

 就在我打算在网上找一个图想贴过来的时候看到了一个面试官的总结,感觉受益匪浅:用两个栈实现一个队列——我作为面试官的小结

直接贴code了:

class Solution
{
   public:
   void push(int node) {
       stack1.push(node);
   }

   int pop() {
       int value = 0;
       if(!stack2.empty()){
           value = stack2.top();
           stack2.pop();
       }
       else{
       	while(!stack1.empty()){
               int temp = stack1.top();
               stack1.pop();
               stack2.push(temp);
           }
           value = stack2.top();
           stack2.pop();
       }
       return value;
   }

   private:
   	stack<int> stack1;
   	stack<int> stack2;
};

 其实code中还有一个问题,就是当队列为空时,如果执行pop操作,返回值为0。

转载于:https://www.cnblogs.com/Bill-LHR/p/6756438.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值