150.逆波兰式的表达式求值
题目链接https://leetcode.cn/problems/evaluate-reverse-polish-notation/
这里想到了迭代器循环。但是直接用string的话没办法与字符进行比较,可以把他声明为const相当于常量引用,硬给他比较(hhh)
最开始一直报错我还反复看一点错没有啊...结果是当时写成了
if(str=="+")st.push(nums1+nums2);
if(str=="-")st.push(nums1-nums2);
if(str=="*")st.push(nums1*nums2);
if(str=="/")st.push(nums1/nums2);
逆波兰式是前后根,就是看成前数字对后数字进行根运算
tokens = ["2","1","+","3","*"] 输出:9 解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
放进栈里面的时候,前数字先放 后数字后放,所以top访问的第一个数字应该是后数字,就是nums1,所以如果要想正确进行运算要用nums2根运算nums1。
怪不得我看那个测试代码只有加和乘的那个运算测试是通过的hhhh
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> st;
for(const string& str:tokens){
if(str=="+"||str=="-"||str=="*"||str=="/"){
long long nums1=st.top();st.pop();//后数字
long long nums2=st.top();st.pop();//前数字
if(str=="+")st.push(nums2+nums1);//是前数字对后数字进行运算
if(str=="-")st.push(nums2-nums1);
if(str=="*")st.push(nums2*nums1);
if(str=="/")st.push(nums2/nums1);
}
else{
st.push(stoll(str));//stoll是把字符串转换为数字类型ll的函数
}
}
int res=st.top();
st.pop();
return res;
}
};
239.滑动窗口的最大值
题目链接https://leetcode.cn/problems/sliding-window-maximum/description/
class Solution {
class Myque{
public:
deque<int> que;
void push(int k){
while(!que.empty()&&k>que.back()){//在加入数据的时候就把前面小的值给全pop掉
que.pop_back();
}
que.push_back(k);
}
void pop(int k){
if(!que.empty()&&que.front()==k){
que.pop_front();//在加入的时候就已经把前面小的数推出去了,到要删的时候就只能是
//删掉这个数和保存的队列最大值相等的时候
}
}
int front(){
return que.front();//封装在类里面的时候,我只有q这个对象不能直接访问到队列只能定义
//一个函数访问队列前面
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
Myque q;
vector<int> res;
for(int i=0;i<k;i++){
q.push(nums[i]);
}
res.push_back(q.front());//遍历前k个后先保存一下最大值
for(int i=k;i<nums.size();i++){
q.pop(nums[i-k]);
q.push(nums[i]);
res.push_back(q.front());
}
return res;
}
};
最开始一直报错,后来发现是遍历前k个之后没有保存前k的个的最大值。
下面是不封装类Myque的方法。
class Solution {
public:
void push(deque<int>& que, int k) {
while (!que.empty() && k > que.back()) {
que.pop_back();
}
que.push_back(k);
}
void pop(deque<int>& que, int k) {
if (!que.empty() && que.front() == k) {
que.pop_front();
}
}
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> q;
vector<int> res;
for (int i = 0; i < k; i++) {
push(q, nums[i]);
}
res.push_back(q.front());
for (int i = k; i < nums.size(); i++) {
pop(q, nums[i - k]);
push(q, nums[i]);
res.push_back(q.front());//这里可以直接访问到队列q就不用定义front函数了
}
return res;
}
};