Java图形化实现LRU页面置换算法

最近要写一个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>&nbsp;&nbsp;"
				+ "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本算法采用的是队列长度为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);
		}
		
	}
   }

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码匀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值