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是最近最久未被访问的页,应将它置换出去。此题直接暴力模拟即可。正确做法:双向链表+哈希表!
![](https://img2018.cnblogs.com/blog/1336165/201810/1336165-20181025204228108-339362799.png)
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 }