剑指offer(5)-----两栈实现队列

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

题目分析:首先了解两者数据结构特性,栈:先进后出,队列:先进先出。我们有stack1和stack2两个栈
入队:直接入stack1即可
出队:当stack2为空,我们直接把stack1中所有元素放到stack2,然后出队就是出stack2的元素,如果stack2有元素,直接出。这样我们就能达到先进先出的效果。
剑指offer(5)-----两栈实现队列_第1张图片
剑指offer(5)-----两栈实现队列_第2张图片

C++代码:
class Solution
{
public:
    void push(int node) {
        stack1.push(node);         
    }

    int pop() {
        int tmp=0;
        if(stack2.empty())
        {
            while(!stack1.empty())
            {
                int a=stack1.top();
                stack2.push(a);
                stack1.pop();
            }
        }
        tmp=stack2.top();
        stack2.pop();
        return tmp;
    }

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

该题的拓展就是两队实现一栈:我们有queue1和queue2
入栈:直接入queue1
出队:
1.看queue1中的元素是不是只有一个,如果只有一个直接出.
2.不是的话就把queue1的元素出队到queue2,但是留下一个元素。然后出queue1留下的元素
3.把queue2的元素再出队到queue1
剑指offer(5)-----两栈实现队列_第3张图片
剑指offer(5)-----两栈实现队列_第4张图片

C++代码:
class Stack
{
public:
    void push(int val)
    {
        queue1.push(val);
    }
    int pop()
    {
        while (queue1.size() != 1)
        {
            queue2.push(queue1.front());
            queue1.pop();
        }
        int sum = queue1.front();
        queue1.pop();
        while (!queue2.empty())
        {
            queue1.push(queue2.front());
            queue2.pop();
        }
        return sum;
    }
    bool empty()
    {
        return queue1.empty();
    }
private:
    queue<int> queue1;
    queue<int> queue2;
};

你可能感兴趣的:(算法冲击)