美文网首页
栈与队列的相互实现

栈与队列的相互实现

作者: analanxingde | 来源:发表于2018-04-04 10:06 被阅读102次

    两个栈实现一个队列

    思路

    进出栈两次之后与队列弹出顺序一致
    stack1:负责压栈,stack2负责弹栈(如果为空,则将stack1中元素全部压入stack2)
    注意:本身队列pop返回值为void,题目中要求的pop返回类型为int。

    代码示例

    class Solution
    {
    public:
        void push(int node) {
            stack1.push(node);
        }
    
        int pop() {
            if(stack2.empty())
            {
                while(!stack1.empty())
                {
                    int val=stack1.top();
                    stack1.pop();
                    stack2.push(val);
                }
            }
            int val=stack2.top();
            stack2.pop();
            return val;
        
        }
    
    private:
        stack<int> stack1;
        stack<int> stack2;
    };
    

    两个队列实现一个栈

    push的时候,往非空的那个队列添加(刚刚初始化的时候,两个队列都为空,随便往哪个队列push都行 下图步骤1和步骤3
    pop的时候,如果队列1不为空,就把队列1中q1.size()-1个元素poll出来,添加到队列2中(下图步骤2中元素1和2),再把队列中那个最后的元素pop出来(步骤2中元素3)
    这两个队列中始终有一个是空的。另一个非空。push添加元素到非空队列中,pop把非空队列中前面的元素都转移到另一个队列中,只剩最后一个元素,再把最后一个元素pop出来。这样这一个队列是空的,另一个队列又非空了。

    两个队列实现一个栈

    代码示例

    class Solution
    {
    public:
    void  push(int node)//在栈尾部添加数据
    {
        if (!q1.empty())//不为空的执行push操作
        {
            q1.push(node);
        }
        else
        {
            q2.push(node);
        }
    }
    template<class T>
    int pop()
    {
        int ret = 0;
        if (q1.empty())
        {
            int i = q2.size();
            while (i > 1 )//将q2队列中的数据pop到只剩一个
            {
                q1.push(q2.front());
                q2.pop();
                --i;
            }
            ret = q2.front();
            q2.pop();
        }
        else
        {
            int i = q1.size();
            while (i > 1)
            {
                q2.push(q1.front());
                q1.pop();
                --i;
            }
            ret = q1.front();
            q1.pop();
        }
        return ret;
    }
    }
    

    栈和队列常见操作附录

    栈的基本操作:stack<int> s;
    s.empty()               如果栈为空返回true,否则返回false  
    s.size()                返回栈中元素的个数  
    s.pop()                 删除栈顶元素但不返回其值  
    s.top()                 返回栈顶的元素,但不删除该元素  
    s.push()                在栈顶压入新元素  
    队列的基本操作:queue<int> q;
    q.empty()               如果队列为空返回true,否则返回false  
    q.size()                返回队列中元素的个数  
    q.pop()                 删除队列首元素但不返回其值  
    q.front()               返回队首元素的值,但不删除该元素  
    q.push()                在队尾压入新元素  
    q.back()                返回队列尾元素的值,但不删除该元素
    

    相关文章

      网友评论

          本文标题:栈与队列的相互实现

          本文链接:https://www.haomeiwen.com/subject/lgzhhftx.html