栈与队列的相互实现

2018-04-04  本文已影响102人  analanxingde

两个栈实现一个队列

思路

进出栈两次之后与队列弹出顺序一致
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()                返回队列尾元素的值,但不删除该元素
上一篇 下一篇

猜你喜欢

热点阅读