最近要写一个LRU置换算法,要求是C语言,但考虑个人原因,于是用Java实现了一个。
运行结果如下图:
程序中实现了数组越界以及循环输入数据的问题
具体代码如下:
package study02;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
public class LRU extends JFrame implements ActionListener{
/**
* @author 1733136292@qq.com
* LRU页面调度算法实现
*/
private static final long serialVersionUID = 1L;
private static JLabel label1,label,label2;//表签
private static JButton but=new JButton("关于");
private static JTextField text=new JTextField(5);
private static JTextField text1=new JTextField(10);
private static JTextArea ta=new JTextArea();;
private static JScrollPane jsp=new JScrollPane(ta);
private static int num;//接收页面数量
private static int[] pagequeue;//页面队列
private static int volum=3;// 栈的容量
private static List<Integer>list=new LinkedList<Integer>();//链表用来模拟栈存放页面
private static int[] visit=new int[1];//要访问的页面数组
private static int count=0;//记录缺页次数
public LRU(){
super("LRU置换算法");
label2=new JLabel();
label2.setText("<html><body>---------------欢迎来到LRU页面置换算法---------------<br> "
+ " 本算法采用的是队列长度为3的队列</body></html>");
this.add(label2);
label2.setBounds(300, 10, 400, 40);
Toolkit toolkit = Toolkit.getDefaultToolkit();//获取屏幕大小
int x = (int)(toolkit.getScreenSize().getWidth())/4;
int y = (int)(toolkit.getScreenSize().getHeight())/4;
this.setLocation(x, y);//设置显示位置
this.setSize(900,600);//设置窗体大小
this.setLayout(null);
this.setVisible(true);//设置窗体课间
label=new JLabel();
label.setText("<html><body>请输入所要置换的页面数量:<br></body></html>");
text.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {//接收窗体内容
String str=text.getText();
num=Integer.parseInt(str);
ta.append("页面数量为:"+num+"\n");
if(num>1){//动态数组扩容
int newArray[]=new int[num];
visit=newArray;
}
ta.append("");
}
});
label1=new JLabel("请输入各个页的页面数据:");
text1.addActionListener(new ActionListener() {//接收窗体内容
@Override
public void actionPerformed(ActionEvent e) {
String str=text1.getText();
String[] numList = str.split(" ");
pagequeue=new int[numList.length];
ta.append("页面数据为: ");
for(int i=0;i<numList.length;i++){
pagequeue[i]=Integer.parseInt(numList[i]);
ta.append(""+pagequeue[i]+" ");
}
ta.append("\n");
if(pagequeue.length>visit.length){
ta.append("输入数组长度越界!请重新输入\n\n");
}
for(int i=0;i<pagequeue.length;i++){
visit[i]=pagequeue[i];
}
sLRU();
ta.append("\n置换页面的数目为:"+count+"\n");
}
});
ta.setLineWrap(true);//设置自动换行
jsp.setPreferredSize(new Dimension(800,400));//设置滚动窗体大小
this.add(label);//添加组件到frame
this.add(text);
this.add(label1);
this.add(text1);
this.add(jsp);
this.add(but);
this.setResizable(false);
but.addActionListener(this);
but.setBounds(700, 75, 80, 40);//设置组件大小以及位置
label.setBounds(100, 60, 400, 40);
text.setBounds(265, 60, 400, 30);
label1.setBounds(100, 110, 400, 40);
text1.setBounds(265, 110, 400, 30);
jsp.setBounds(100, 160, 700, 400);
//this.pack();
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
public static void main(String []args)//主方法
{
new LRU();//加载窗体
ta.append("success!\n"); //测试是否执行
}
public static void sLRU()//LRU算法实现
{
int index=0;
while(index<visit.length)
{
boolean flag=false;
if(list.size()<=volum)
{
for(int i=0;i<list.size();i++)
{
if((int)(list.get(i))==visit[index])
{
list.remove(i);//先删除
list.add(visit[index]);//再添加到尾部
flag=true;
break;
}
}
if(!flag)
{
if(list.size()<volum)
{//如果栈未满,而且此页面没有在栈中,就将它入栈
list.add(visit[index]);
}
else
{//如果栈已经满了,且该页面号码没有在栈中,就把栈底元素删除,将新页插入
int temp=list.get(0);
list.remove(0);//最开始一个换出
list.add(visit[index]);//加到末尾
count++;//计算缺页数
System.out.println("换页,将栈底的"+temp+"换出");
ta.append("换页,将栈底的"+temp+"换出\n");
}
}
System.out.print("第"+(index+1)+"个页面的栈内容为");
ta.append("第"+(index+1)+"个页面的栈内容为:");
for(int k=0;k<list.size();k++){
System.out.print(list.get(k)+" ");
ta.append(list.get(k)+" ");}
System.out.println();
ta.append("\n");
index++;
}
}
}
@Override
public void actionPerformed(ActionEvent e) {//显示信息
if(e.getSource()==but){
JOptionPane.showMessageDialog(this, "路漫漫其修远兮,吾将上下而求索!","关于",JOptionPane.QUESTION_MESSAGE);
}
}
}