欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用两个栈实现队列

程序员文章站 2022-03-14 15:31:56
...

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

自己的思路
思路应该都能想得到,就是想将所有的数压入一个栈,再全部出栈并压入另一个栈,再出栈,次时就是先进先出的顺序了。但是实现起来貌似并不容易,需要判断是不是栈中最后一个元素,以及什么时候开始压入另一个栈,可能还是自己对栈这个数据结构不够熟悉吧,感觉自己写对了,但是提交后就是错误的,还是先上代码吧

class Solution
{
public:
    int num=0;
    void push(int node) {
        stack1.push(node);
        ++num;
    }

    int pop() {
        while(stack1.size()>0){
            int temp = stack1.top();
            stack1.pop();
            stack2.push(temp);
        }
        
        int temp2 = stack2.top();
        stack2.pop();
    }

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

大佬的思路
其实自己的代码通过修改就可以a的,但是可能心态浮躁,改不下去了,止步正确答案。思路其实没问题的,就是里面的判断条件及返回值没有思考清楚,题目的意思是可以通过这个类对象,每次调用push函数,就压入一个元素,调用pop函数就出一个元素,故pop里面肯定是要return一个元素的。关键点就是pop函数中,进入的时候要先判断stack2是否为空,也就是第一次调用的时候会为将stack1的所有元素出栈,并压入stack2,然后弹出stack2栈顶元素,后面每次调用pop函数就仅仅是弹出栈顶元素了。(其实还有一种方法是通过栈的下标,因为栈是有下标的,且[0]位于栈底,这里就不去总结了

根据大佬的代码,在自己的代码上进行修改一下(其实就是几乎完全一样了)
上代码

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

    int pop() {
        if(stack2.empty()){ //只有第一次调用pop会进入这个条件
            while(!stack1.empty()){ 
               int temp = stack1.top();
               stack2.push(temp); //这里的push和top是栈里面的函数,不是这个类的成员函数
               stack1.pop(); 
            }
        }
        
        int temp2=stack2.top(); //这样就保证了每次就弹出一个元素
        stack2.pop();
        return temp2;
    }

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