** 150. 逆波兰表达式求值 **
leetcode链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/
题目描述:给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。
核心思路:逆波兰表达式求值要求遇到运算符就将最近的两个数字执行该运算,因此可以考虑栈的先进后出特性,本题测试数据较大,为防止超出界限,考虑使用long long类型的变量。

点击查看代码
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> st;//遇到运算符取最近的两个元素运算,因此需要使用栈
        for(int i = 0;i < tokens.size();i++){
            if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/"){
                long long num1 = st.top();
                st.pop();
                long long num2 = st.top();
                st.pop();
                long long sum = 0;
                if(tokens[i] == "+")sum = num2 + num1;
                if(tokens[i] == "-")sum = num2 - num1;
                if(tokens[i] == "*")sum = num2 * num1;
                if(tokens[i] == "/")sum = num2 / num1;
                st.push(sum);
            }
            else {
                 st.push(stoll(tokens[i]));//stoll将字符串整数转化为long long整值
            }
        }
        long long result = st.top();
        st.pop();
        return result;
    }
};
**239. 滑动窗口最大值 ** leetcode链接:https://leetcode.cn/problems/sliding-window-maximum/description/ 题目描述:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。 核心思路:将可能是最大值的元素索引存进队列,当遍历到的值大于该元素时就更新索引,同时当队头元素超出窗口(过期)时,就移除队头的元素索引
点击查看代码
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> res;//定义res存储最终结果
        deque<int> que;//定义双端队列来存储窗口内的最大值的索引
        for(int i = 0;i < nums.size();i++){//窗口的右边界为i,左边界为i-k+1
            if(!que.empty() && que.front() <= i-k){//当队首的索引小于i-k时,索引对应的元素已出窗口,因此移除索引
                que.pop_front();
            }
            while(!que.empty() && nums[i] > nums[que.back()]){
                que.pop_back();//当前元素大于队尾索引对应的元素时,移除队尾元素,更新最大值索引
            }
            que.push_back(i);
            if(i >= k-1){//左边界出现时,即窗口出现时
                res.push_back(nums[que.front()]);
            }
        }
        return res;
    }
};
**347.前 K 个高频元素**(语法不太熟悉,明天尝试实现) leetcode链接:https://leetcode.cn/problems/top-k-frequent-elements/description/ 题目描述:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 核心思路:使用哈希表和小堆顶来实现。哈希表存储元素频率,小堆顶会将里面的元素从小到大排序。因此只要遍历哈希表的元素频率不断压进小堆顶,而小堆顶只保留频率最大的k位元素即可实现。
点击查看代码
class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int> frep;//定义哈希表
        for(int num : nums){
            frep[num]++;//哈希表的键为元素值,值为元素频率
        }
        //定义小顶堆,其中greater为比较函数
        //greater比较两个pair对,优先比较第一个参数(本题传入<元素频率,元素值>)
        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> heap;
        for(unordered_map<int,int>::iterator it = frep.begin();it != frep.end();++it){
            int num = it->first;//元素值
            int cnt = it->second;//元素频率

            if(heap.size() >= k){//堆大于k时比较堆顶(最小)的元素
                if(cnt > heap.top().first){
                    heap.pop();//堆顶元素小时更新元素
                    heap.emplace(cnt,num);//优先传入元素频率
                }
            }
            else{
                heap.emplace(cnt,num);//不满k时,将元素加入堆中
            }
        }
        vector<int> res;
        while(!heap.empty()){
            res.push_back(heap.top().second);
            heap.pop();
        }
        return res;
    }
};