【C++】移动窗口
Tips:此程序经过优化,将进退栈整合为一次遍历。
#include <iostream>
#include <string>
#include <ctime>
#include <stack>
using namespace std;
struct MAXINSTACKint{stack<int>data;stack<int>max;stack<int>min;//void push(int num){if(!max.empty()){if(max.top()<=num){max.push(num);}}else max.push(num);if(!min.empty()){if(min.top()>=num){min.push(num);}}else min.push(num);data.push(num);}void pop(){if(max.top()==data.top())max.pop();if(min.top()==data.top())min.pop();data.pop();}bool empty(){return data.empty();}
};
struct MAINSTACK{MAXINSTACKint main_;stack<int> help_;//void push_and_pop(int a,int b){bool add=1;bool del=0;while(true){//cout<<main_.max.empty()<<endl;if(add==0&&del==1)break;if(main_.max.empty()){main_.max.push(a);add=0;break;}if(main_.max.top()<=a&&add){main_.max.push(a);add=0;continue;}if(main_.max.top()!=b||del){help_.push(main_.max.top());}else {//cout<<"del"<<endl;del=1;}main_.max.pop();}while(!help_.empty()){main_.max.push(help_.top());help_.pop();}}
};
int main(){int a[1010];MAINSTACK T;int n,k;cin>>n>>k;for(int i=0;i<n;i++){cin>>a[i];}for(int i=0;i<k;i++){T.push_and_pop(a[i],-1);}cout<<T.main_.max.top()<<endl;for(int i=k;i<n;i++){T.push_and_pop(a[i],a[i-k]);cout<<T.main_.max.top()<<endl;}return 0;
}