2020-06-04(补充记录)栈-用队列实现栈

题目详情

使用队列实现栈的下列操作:

push(x) -- 元素 x 入栈
pop() -- 移除栈顶元素
top() -- 获取栈顶元素
empty() -- 返回栈是否为空

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-stack-using-queues

思路

因为队列的特点是先进先出,而栈的特点是后进先出(先进后出)。
所以我们的目的就是把先进队的元素转移到后面,比如 5 - 4 - 3依次进入队列,就需要转换成 3 - 4 - 5 的排列顺序,形成栈的结构。
所以假设我们先定义一个队列queue
std::queue temp_queue;
由于每次push进队列的只有一个值。根据这个特点我们先把这个值push进队列(假设为5)
所以现在temp_queue = {5},对于第二个需要push的值(假设为4),肯定是不能直接push进temp_queue的,不然就又是队列的结构了。所以如果我们把temp_queue里有的值pop出来,并存到另外一个队列中(假设定义为data_queue),此时temp_queue为空,然后我们知道data_queue = {5}。
再把第二个值push进temp_queue,temp_queue = {4}。仔细观察可以发现,如果把data_queue里的值pop出来push进temp_queue。在temp_queue里就构成了 5->4 的队列 其中4在头部。然后再把temp_queue的值依次push进data_queue , data_queue就是对应的栈结构了。

后续的操作就很类似了

就是把data_queue里已经构成栈结构的成员看成一个整体,再进行上面同样的操作,就能实现把后进队的元素放到头部,从而一直构成栈的结构(如果画个图上面的过程会更清晰!)

其他函数的补充就比较简单不做笔记了,详情见下代码

class MyStack {
public:
    /** Initialize your data structure here. */
    MyStack() {

    }
    
    /** Push element x onto stack. */
    void push(int x) {
        std::queue temp_queue;
        temp_queue.push(x);
        while(!data.empty())
        {
            temp_queue.push(data.front());
            data.pop();
        }
        while(!temp_queue.empty())
        {
            data.push(temp_queue.front());
            temp_queue.pop();
        }
    }
    
    /** Removes the element on top of the stack and returns that element. */
    int pop() {
        int x = data.front();
        data.pop();
        return x;
    }
    
    /** Get the top element. */
    int top() {
        return data.front();
    }
    
    /** Returns whether the stack is empty. */
    bool empty() {
        return data.empty();
    }
private:
    std::queue data;
};

你可能感兴趣的:(2020-06-04(补充记录)栈-用队列实现栈)