代码随想录算法训练营第十天| 栈与队列

Posted by Zhuoqun on January 19, 2023

232.用栈实现队列

思路是对的,但是还是没完全写对。不需要每次pop或者peek的时候检查s1里还有没有数。因为先把s2里的用完就行,毕竟那里面的数是比新加进来的数更早需要被弹出的。所以在s2里的数没用完之前,不需要考虑s1。而且有新的数要加入的时候,可以直接先放进s1。

另外,在最开始写这道题的时候,我没想好应该在哪里创建两个stack,这也是我基础不扎实的表现。

class MyQueue {
public:
    stack<int> s1;
    stack<int> s2;
    MyQueue() {

    }
    
    void push(int x) {
        s1.push(x);
    }
    
    int pop() {
        if(s2.empty()){
            while(!s1.empty()){
                s2.push(s1.top());
                s1.pop();
            }
        }
        int res = s2.top();
        s2.pop();
        return res;
    }
    
    int peek() {
        if(s2.empty()){
            while(!s1.empty()){
                s2.push(s1.top());
                s1.pop();
            }
        }
        int res = s2.top();
        return res;
    }
    
    bool empty() {
        if(s1.empty() && s2.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();
 */

225. 用队列实现栈

嘿嘿,这回是比之前做得快了。瞄到了Carl的笔记说可以用一个queue来写出来,我就突然想到可以用size()来遍历。做得很轻松。

class MyStack {
public:
    int size = 0;
    queue<int> que;

    MyStack() {

    }
    
    void push(int x) {
        que.push(x);
        size++;
    }
    
    int pop() {
        int loop = size - 1;
        while(loop--){
            int cur = que.front();
            que.pop();
            que.push(cur);
        }
        int res = que.front();
        que.pop();
        size--;
        return res;
    }
    
    int top() {
        int loop = size;
        int cur;
        while(loop--){
            cur = que.front();
            que.pop();
            que.push(cur);
        }
        return cur;
    }
    
    bool empty() {
        if(que.empty())
            return true;
        else
            return false;
    }
};

看了Carl的解析,原来queue还有back()这么个函数,那写top()就更方便了,可以直接用top()。