剑指offer-队列&栈

1.用两个栈实现队列

实现一个函数:将一个栈倒腾到另外一个栈。

class Solution {
    void inToOut() {
        if (out.empty()) {
            while (in.size()) {
                int num = in.top();
                in.pop();
                out.push(num);
            }
        }
    }
public:
    void push(int node) {
        in.push(node);
        inToOut();
    }

    int pop() {
        inToOut();
        int num = out.top();
        out.pop();
        return num;
    }
private:
    stack<int> in;
    stack<int> out;
};

2.包含min函数的栈

实现一个辅助栈,该栈只存储当前栈中最小的数值。

class Solution {
    stack<int> stk, minStk;
public:
    void push(int value) {
        stk.push(value);
        if (minStk.empty()) {
            minStk.push(value);
        } else {
            int num = ::min(minStk.top(), value);
            minStk.push(num);
        }
    }
    void pop() {
        stk.pop();
        minStk.pop();
    }
    int top() {
        return stk.top();
    }
    int min() {
        return minStk.top();
    }
};

3.栈的压入弹出序列

    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if (pushV.empty() and popV.empty()) return true;
        if (pushV.size() != popV.size()) return false;
        stack<int> stk;
        int popId = 0;
        for (int i = 0; i < pushV.size(); ++i){
            stk.push(pushV[i]);
            while (stk.size() && stk.top() == popV[popId]) {
                stk.pop();
                ++popId;
            }
        }
        return stk.empty();
    }

4.翻转单词序列

使用字符串流

    string ReverseSentence(string str) {
        if (str.empty()) return str;
        istringstream iss(str);
        string temp;
        vector<string> vec;
        while (iss >> temp) {
            vec.emplace_back(temp);
        }
        string res;
        for (auto it = vec.rbegin(); it != vec.rend(); ++it) {
            res += *it + ' ';
        }
        res.pop_back();
        return res;
    }

5.滑动窗口的最大值

维护一个单调递增双端队列:大小不会超过规定窗口大小,确保单调递增。

    vector<int> maxInWindows(const vector<int>& nums, unsigned int size) {
        vector<int> res;
        if (size == 0 or nums.empty()) return res;
        deque<int> q;
        for (int i = 0; i < nums.size(); ++i) {
            if (q.size() and i - q.front() >= size) q.pop_front();
            while (q.size() and nums[q.back()] <= nums[i]) q.pop_back();
            q.push_back(i);
            if (i + 1 >= size) res.emplace_back(nums[q.front()]);
        }
        return res;
    }
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务