Problem Description:
sss操作系統沒聽課, 這周的操作系統作業完全不會, 你能幫他寫出來嗎, 以下是操作系統老師的實驗說明:
LRU算法解釋:
LRU置換算法是選擇最近最久未使用的頁面予以淘汰。該算法賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間t,當須淘汰一個頁面時,選擇現有頁面中其t值最大的,即最近最久未使用的頁面予以淘汰。
LRU的實現(需要“堆棧”支持):
可利用一個特殊的棧來保存當前使用的各個頁面的頁面號。每當進程訪問某頁面時,便將該頁面的頁面號從棧中移出,將它壓入棧頂。因此,棧頂始終是最新被訪問頁面的編號,而棧底則是最近最久未使用頁面的頁面號.
Output:
輸出一行, 最后棧內的元素(從棧底開始輸出)
Sample Input:
5 11
4 7 0 7 1 0 1 2 1 2 6
Sample Output:
7 0 1 2 6
解題思路:結合LRU置換算法的定義舉個栗子:假設現有一進程所訪問的頁面序列為:4,7,0,7,1,0,1,2,1,2,6。隨着進程的訪問,棧中頁面號的變化情況如圖所示。在訪問頁面6時發生了缺頁,此時頁面4是最近最久未被訪問的頁,應將它置換出去。此題直接暴力模擬即可。正確做法:雙向鏈表+哈希表!

AC代碼:
1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long LL;
4 const int maxn=500005;
5 int n,m,x,cnt,stk[110],pos[maxn];
6 int main(){
7 while(cin>>n>>m){
8 cnt=0;memset(pos,0,sizeof(pos));//標記頁面在棧中的位置
9 while(m--){
10 cin>>x;
11 if(pos[x]){//棧中已出現x,將x提到棧頂,剩下的頁面往下移
12 for(int i=pos[x];i<cnt;++i)stk[i]=stk[i+1],pos[stk[i]]=i;
13 stk[cnt]=x,pos[x]=cnt;
14 }
15 else{//x未出現
16 if(cnt!=n)stk[++cnt]=x,pos[x]=cnt;//棧未滿則直接添加
17 else{//棧滿,移去最久未使用的頁面,將x放棧頂
18 for(int i=1;i<n;++i)stk[i]=stk[i+1],pos[stk[i]]=i;
19 stk[n]=x,pos[x]=n;
20 }
21 }
22 }
23 for(int i=1;i<=cnt;++i)cout<<stk[i]<<(i==cnt?'\n':' ');//輸出當前棧中的頁面號
24 }
25 return 0;
26 }