算法训练营第十天(7.21)| 栈&队列Part01:基础

目录

LeeCode232. Implement Queue using Stacks

LeeCode232. Implement Queue using Stacks


 

LeeCode232. Implement Queue using Stacks

题目地址:力扣

题目类型:栈构造队列

算法训练营第十天(7.21)| 栈&队列Part01:基础_第1张图片算法训练营第十天(7.21)| 栈&队列Part01:基础_第2张图片

 思路:分别构造stIn(进队)和stOut(出队),当需要pop或者peek时,观察stOut是否为空,如果为空,将stIn的元素依次压栈进入stOut,之后可以直接在栈顶取元素或者弹出元素

class MyQueue {
private:
    stack stIn, stOut; 
public:
    MyQueue() {
           
    }
    
    void push(int x) {
        stIn.push(x);
    }
    
    int pop() {
        // 只有当stOut不为空的时候,才一次性全将In的数据全部放入Out中
        if (stOut.empty()) {
            while (!stIn.empty()) {
                stOut.push(stIn.top());
                stIn.pop();
            }
        }
        int ans = stOut.top();
        stOut.pop();
        return ans;
    }
    
    int peek() {
        // 只有当stOut不为空的时候,才一次性全将In的数据全部放入Out中
        if (stOut.empty()) {
            while (!stIn.empty()) {
                stOut.push(stIn.top());
                stIn.pop();
            }
        }
        return stOut.top();
    }
    
    bool empty() {
        if (stIn.empty() && stOut.empty()) return true;
        return false;
    }
};

 


LeeCode232. Implement Queue using Stacks

题目地址:力扣

题目类型:队列构造栈

算法训练营第十天(7.21)| 栈&队列Part01:基础_第3张图片 算法训练营第十天(7.21)| 栈&队列Part01:基础_第4张图片

 思路:构造两个队列qu1和qu2,使用flag标记正在使用哪一个队列,每次top和pop都将qu1和qu2置换,从而取出最后一个元素

class MyStack {
private:
    queue qu1, qu2;
    bool flag;
public:
    MyStack() {
        flag = true; // 代表qu1是否为当前存储队列
    }
    
    void push(int x) {
        if (flag) {
            qu1.push(x);
        }
        else qu2.push(x);
    } 
    
    int pop() {
        int ans;
        if (flag) {
            while (qu1.size() > 1) {
                qu2.push(qu1.front());
                qu1.pop();
            }
            ans =  qu1.front();
            qu1.pop();
        }
        else {
            while (qu2.size() > 1) {
                qu1.push(qu2.front());
                qu2.pop();
            }
            ans = qu2.front();
            qu2.pop();
        }
        flag = !flag;
        return ans;
    }
    
    int top() {
        int ans;
        if (flag) {
            while (qu1.size() > 1) {
                qu2.push(qu1.front());
                qu1.pop();
            }
            ans =  qu1.front();
            qu1.pop();
            qu2.push(ans);
        }
        else {
            while (qu2.size() > 1) {
                qu1.push(qu2.front());
                qu2.pop();
            }
            ans = qu2.front();
            qu2.pop();
            qu1.push(ans);
        }
        flag = !flag;
        return ans;
    }
    
    bool empty() {
        return qu1.empty() && qu2.empty();
    }
};

你可能感兴趣的:(算法训练营,算法,数据结构,c++)