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

版权声明:转载请注明出处!欢迎大家提出疑问或指正文章中的错误! https://blog.csdn.net/pyuxing/article/details/89432149

本文系《剑指offer》的刷题记录,通过牛客网在线平台测试通过。
在线测试平台:牛客网
编程资料获取:CodeLab

1-Description

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

2-Solution

1-问题分析
栈的特点是后进先出,即最后被压入(push)栈的元素会第一个被弹出(pop)
队列的特点是先进先出,即第一个被压入队列的元素将会第一个被弹出

下面通过一个具体实例分析如何用两个栈实现一个队列的push以及pop:

  • 首先插入一个元素a到stack1,此时stack1中有元素{a},stack2为空,再将b,c压入stack1中,stack1中元素有{a,b,c},此时stack2仍然是空的,如下图所示:
  • 此时,我们想从队列弹出一个元素,由于a比b、c要先进入队列,最先被删除的元素应该是a,然而a存于stack1中,并非栈顶因此不可直接弹出。所以这里需要借助于stack2来帮助完成,如果把stack1中的元素逐个压入stack2中,元素在stack2中的元素顺序正好与原来stack1中顺序相反。因此经过3次弹出stack1和压入stack2操作之后,stack1为空,而stack2中元素为{c,b,a},这样就可以弹出stack2栈顶元素a了,如下图所示:
  • 接下来再压入一个元素d,由于c、b均早于d进入队列,所以先判断stack2不为空,直接依次弹出b、c,如下图所示:

2-解决代码
依据以上分析,可以写出如下代码:

class Solution
{
public:
    void push(int node) {
        stack1.push(node);//按正常入栈1
    }

    int pop() {
        int data;
        while(stack2.empty()){
            while(!stack1.empty()){//如果栈2是空的,就可以直接入栈了
                int datatop = stack1.top();//取栈顶的元素压入栈1
                stack1.pop();//栈顶元素出栈1
                stack2.push(datatop);//将栈1的栈顶元素压入栈2
            }
        }
        data = stack2.top();//如果栈2是非空的话,需要进行弹出操作
        stack2.pop();
        return data;
    }

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

PS:公众号上线啦,技术干货分享,欢迎关注。

猜你喜欢

转载自blog.csdn.net/pyuxing/article/details/89432149