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

栈与队列的相互实现

作者: 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()                返回队列尾元素的值,但不删除该元素

相关文章

  • Swift 队列&栈 相关操作

    栈 LIFO(后进先出) 队列 FIFO(先进先出) 队列与栈相互的实现 栈 - 队列实现 队列 - 栈实现 相关...

  • 栈与队列的相互实现

    两个栈实现一个队列 思路 进出栈两次之后与队列弹出顺序一致stack1:负责压栈,stack2负责弹栈(如果为空,...

  • Algorithm小白入门 -- 队列和栈

    队列和栈队列实现栈、栈实现队列单调栈单调队列运用栈去重 1. 队列实现栈、栈实现队列 队列是一种先进先出的数据结构...

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • 栈&队列

    一、栈&队列总结 栈/队列的应用接雨水验证栈序列滑动窗口的最大值 栈/队列的特殊实现用两个栈实现队列用两个队列实现...

  • 38_两个有趣的问题

    关键词:通过栈实现队列、通过队列实现栈 0. 通过栈实现队列 用栈实现队列等价于用后进先出的特性实现先进先出的特性...

  • 队列之-队列实现栈

    一、队列实现栈核心算法概述 之前已经描述过了用栈实现队列的功能,见栈系列之-实现队列,那么同样队列也可以用来实现栈...

  • 算法-栈和队列算法总结

    栈和队列算法总结 1 模拟 1.1 使用栈实现队列 1.2 使用队列实现栈 2 栈的应用 2.1 栈操作 2.2 ...

  • leecode刷题(26)-- 用栈实现队列

    leecode刷题(26)-- 用栈实现队列 用栈实现队列 使用栈实现队列的下列操作: push(x) -- 将一...

  • 用两个栈实现队列,用两个队列实现堆栈

    参考:剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈 用两个栈实现队列stack1作为入...

网友评论

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

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