代码随想录算法训练营29期Day10|LeetCode 225,232

文档讲解:

理论基础

用栈实现队列

用队列实现栈

225.用队列实现栈

题目链接:https://leetcode.cn/problems/implement-stack-using-queues/submissions/493416480/

思路:

       首先我们朴素的能想到用两个队列实现栈,但其实一个队列也能实现。

       push操作我们直接将值加入队列即可。

       pop操作我们将队尾前的所有元素全部弹出重新加到队尾,那么原本的队尾就成了队头,即栈顶,取值弹出即可。

       top操作与pop逻辑相同。

       empty与队列的empty相同,队列空则栈空。

核心代码:

class MyStack {
private:
    queue que;
public:
    MyStack() {
        while(!que.empty()) que.pop();
    }
    
    void push(int x) {
        que.push(x);
    }
    
    int pop() {
        int n=que.size();
        n--;
        while(n--){
            que.push(que.front());
            que.pop();
        }
        int ans=que.front();
        que.pop();
        return ans;
    }
    
    int top() {
        int ans=pop();
        push(ans);
        return ans;
    }
    
    bool empty() {
        return que.empty()?true:false;
    }
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */

232.用栈实现队列

题目链接:https://leetcode.cn/problems/implement-queue-using-stacks/description/

思路:

       我们用两个栈即可实现队列。其中一个栈作为主体,一个栈作为中转。

       push操作我们就将值加入栈即可。

       pop操作需要弹出队头元素也即栈底元素。那我们就将栈里的元素挨个弹出来,放到另一个栈里作为中转,直到栈底停止。然后我们取出栈底元素弹出,再把中转栈里的元素加回主体栈即可。

       top与pop逻辑相同,区别是不弹主体栈栈底元素,只查看值。

       empty与主体栈empty相同,如果栈空则说明队列空。

核心代码:

class MyQueue {
private:
    stack stl;
    stack str;
public:
    MyQueue() {

    }
    
    void push(int x) {
        str.push(x);
    }
    
    int pop() {
        while(!str.empty()){
            stl.push(str.top());
            str.pop();
        }
        int ans=stl.top();
        stl.pop();
        while(!stl.empty()){
            str.push(stl.top());
            stl.pop();
        }
        return ans;
    }
    
    int peek() {
        while(!str.empty()){
            stl.push(str.top());
            str.pop();
        }
        int ans=stl.top();
        while(!stl.empty()){
            str.push(stl.top());
            stl.pop();
        }
        return ans;
    }
    
    bool empty() {
        if(str.empty()) return true;
        else return false;
    }
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */

今日总结

        今日学习时长2h,因为以前系统的学习过数据结构和算法,队列和栈又是比较基础的数据结构,因此做起来很简单。

        依旧要复习周末期末考试。

你可能感兴趣的:(代码随想录算法训练营29期,算法,leetcode,职场和发展,c++)