《剑指offer》——用两个栈实现队列

来源:互联网 发布:dnf怎么老网络中断 编辑:程序博客网 时间:2024/05/22 06:22

题目:
用两个栈实现队列。

分析与解法:
使用两个栈stack1和stack2。

  • 假设入栈时使用stack1;
  • 则出栈时使用stack2,若stack2中没有元素,则将stack1中的元素依次出栈,并在stack2依次入栈,再使stack2中的元素出栈,则stack1中先入栈的元素先出栈;若出栈时stack2中有元素,则直接出栈。

如图所示,
这里写图片描述

代码如下,

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

相关题目:
用两个队列实现栈。

分析与解法:
使用两个栈queue1和queue2。

  • 假设入队时使用queue1;
  • 则出队时应当将queue1中最后一个元素之前的所有元素都入队到queue2,然后让queue1中的最后一个元素出队。如果想继续让倒数第二个入队的元素出队,此时该元素为queue2中最后一个元素,于是同样将其之前的元素都入队到queue1,再让该元素出队。以此类推。

如图所示,
这里写图片描述

代码如下,

class Solution{public:    void push(int node)    {        queue1.push(node);    }    int pop()    {        int pop;        if(queue1.empty() && !queue2.empty())        {            while(queue2.empty() > 1)            {                queue1.push(queue2.front());                queue2.pop();            }            pop = queue2.front();            queue2.pop();        }        else if(queue2.empty() && !queue1.empty())        {            while(queue1.size() > 1)            {                queue2.push(queue1.front());                queue1.pop();            }            pop = queue1.front();            queue1.pop();        }        return pop;    }private:    queue<int> queue1;    queue<int> queue2;};
0 0
原创粉丝点击