剑指offer-用两个栈实现队列

用两个栈实现一个队列

一、算法思想

  • 栈的特点是进出在同一头,满足后进先出的顺序
  • 队列的特点是进出在两头,满足先进先出的顺序

stack1用于存放入队的元素,以压栈的方式压入stack1,但是这样取出的顺序是反的,所以将stack2当作中转站,这样顺序就变成先进先出了。

二、算法步骤

  1. 入队:先判断stack1是否已满。如果已满,则以出栈顺序全部压入stack2。然后再入队。如果不满,则直接入队即可。
  2. 出队:先判断stack2是否为空。如果为空,先将stack1中内容全部出栈压入stack2,然后再出队。如果不为空,则直接出队即可。

三、算法实现

3.1 C++写法

class Solution
{
public:
    void push(int node) {
        //判满步骤省略,stack容器是动态的
        stack1.push(node);
    }

    int pop() {
        if(stack2.empty()){//stack2为空
            if(stack1.empty()){//stack1也为空
                return 0;
            }
            else{//stack1中有元素
                while(!stack1.empty()){
                    int temp=stack1.top();
                    stack1.pop();
                    stack2.push(temp);
                }
            }
        }
        int top=stack2.top();
        stack2.pop();
        return top;
    }

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

C++ STL的stack的使用参见我的另外一篇博客:C++ STL容器——stack用法介绍

keep going
原文地址:https://www.cnblogs.com/MarkKobs-blog/p/10347678.html