码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-05-19 22:45:58      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:while   实现   void   不为   用两个   private   允许   操作   turn   

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

思路:

    1. 首先要明确队列的特性是先进先出,栈的特性是先进后出;
    2. 在进队列的方法里我们只要有容器能装元素就行了,所以直接往栈1里压;
    3. 在出队列方法里,要保证出队列的是最先进入的元素:
      • 最直观的想法就是把栈1的元素挨个出栈,然后往栈2里压。
    4. 但是还是要思考一下真的这么简单吗?不是的,栈2为空时才允许栈1往外弹元素并压到栈2里。
      • 如果随时都可以往栈2里压,那么往栈1里压两个元素5、6(栈1状态是:{5,6}),马上出栈往栈2里压(栈2状态:{6,5});
      • 接着栈1又来了个元素7,栈2的元素5、6还没出栈,此时要是再把7压到栈2那么栈顶元素就变7了,没法先取出5;
      • 所以在往栈2压完一批元素后,栈1进了新的元素想往栈2压的时候,栈2必须把上一批的元素清空了才行(也就是栈2必须是空的)。

public:
void push(int node) {
   stack1.push(node); //stack1存入该数
}

int pop() {
   int res;
   if (stack2.size() > 0) {  //stack2不为空
     res = stack2.top();  //取值stack2的第一个元素
      stack2.pop();  //删除stack2的第一个元素
   }
  else if (stack1.size() > 0) {  //stack1不为空
    while (stack1.size() > 0) { 
      int ele = stack1.top(); //取值stack1的第一个元素

      stack1.pop(); //删除stack1的第一个元素

      stack2.push(ele); //将stack1的第一个元素赋值给stack2  这里是将stack1的元素存入stack2 ,stack1,2都为为先进后出,将顺序调整为了先进先出
    }
    res = stack2.top(); //取值stack2的第一个元素
    stack2.pop(); //删除stack2的第一个元素
  }
  return res;
}

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

思路和题解都是借鉴别人的  要好好理解理解

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

标签:while   实现   void   不为   用两个   private   允许   操作   turn   

原文地址:https://www.cnblogs.com/yl1995/p/12919724.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!