因为怕被老师抽查问到,所以连夜把这个算法用javaScript写出来了,之所以用JavaScript写出来,还是因为其交互页面可以自己设计更美观,其次就是JavaScript写起来比较轻量把,对运行环境要求没有那么高,最重要一点就是每一行结尾可以不写分号(懒人狂喜)且JavaScript对数组和字符串的API使用起来比较方便,所以以后写算法应该都是用JavaScript了。
首先说一下思路:我既没有用到栈也没有用到链表,当时感觉用数组加原生js 就可以实现了,自始至终都是对数组和对象进行操作,首先输入一个数字决定运行的进程个数,然后动态创建输入框,输入进程的运行信息,把每个进程的信息放在对象中储存,然后用数组存储多个对象,定义一个全局的时间Time,有多少个进程就遍历多少次,遍历一遍将一个符合要求的进程的状态status由wait改为ready,之后遍历的时候通过filter筛选出status=="wait"的进行遍历既可,如果在一定时间内有多个进程可以被执行,并且createTime<Time,将这些进程push到数组newArr中,然后调用sortall(newArr)函数处理,最后结束alert("运行结束!")。
那么sortall函数如何实现呢?
有以下两种情况:
1,newArr.length!=0,然后筛选出最大的优先数的数组下标(这里默认最大的优先执行),修改status和Time,然后输出(Timfe)
if (newArr.length != 0) {
let Max = 0
let Maxindex = 0
newArr.forEach((item, index) => {
if (item.priority > Max) {
Max = item.priority;
Maxindex = index
}
})
arrall.forEach(item => {
if (item.name === newArr[Maxindex].name) {
item.status = "ready"
Time = parseInt(item.runTime) + parseInt(Time)
}
})
print_info(newArr, Maxindex, index)
}
2,newArr.length==0,表示无一个进程createTime<Time,此时直接以Time作为加载线程的初始时间,修改status和Time,然后输出
{
let Min = 99999
let Minindex = 0
let Max = 0
let Maxindex = 0
let someArr = []
waitarrall.forEach((item, index) => {
if (parseInt(item.createTime) <= Min) {
Min = parseInt(item.createTime);
Minindex = index
}
})
waitarrall.forEach(item => {
if (parseInt(item.createTime) === Min) {
someArr.push(item)
}
})
someArr.forEach((item, index) => {
if (item.priority > Max) {
Max = item.priority;
Maxindex = index
}
})
arrall.forEach(item => {
if (item.name === someArr[Maxindex].name) {
item.status = "ready"
Time = parseInt(item.createTime) + parseInt(item.runTime)
}
})
print_info(someArr, Maxindex, index)
}
print_info为输出的函数:
function print_info(newArr, Maxindex, index) {
statement = ""
let sortArr = []
newArr.forEach(item => {
sortArr.push(item.priority)
})
let string = sortArr.sort().join(" ")
statement = statement.concat("当前就绪进程:")
newArr.forEach(item => {
statement = statement.concat(item.name + " ")
})
statement = statement.concat("<br>")
statement = statement.concat("当前就绪线程优先级:" + string)
statement = statement.concat("<br>")
statement = statement.concat("时间Time:" + Time + ",进程" + newArr[Maxindex].name + "完成")
statement = statement.concat("<br>")
statement = statement.concat("--------------")
statement = statement.concat("<br>")
result.children[index].innerHTML = statement
}
基本的算法思想就是这些了,全部代码(涵html+css)如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
.content input {
display: block;
margin-top: 10px;
}
.button1 {
display: none;
}
.main_content {
width: 1200px;
margin: 100px auto;
display: flex;
}
.main {
width: 500px;
padding: 10px;
font-size: 14px;
font-weight: 600;
}
.result {
width: 400px;
margin-left: 150px;
font-size: 14px;
font-weight: 600;
}
.result div {
display: none;
border: 2px solid #ccc;
margin-top: 20px;
}
.result div:nth-child(1) {
margin-top: 0;
}
</style>
</head>
<body>
<div class="main_content">
<div class="main">
<div>
输入进程的数量<input type="text" class="inputnum">
<button class="button">确定</button>
</div>
<div class="title">输入进程的信息(标识符、创建时间、运行时间、优先级数)以空格分隔</div>
<div class="content"></div>
<button class="button1">开始执行</button>
</div>
<div class="result">
</div>
</div>
<script>
var input = document.querySelector(".inputnum")
var btn = document.querySelector(".button")
var btn1 = document.querySelector(".button1")
var content = document.querySelector(".content")
var result = document.querySelector(".result")
var arrall = []
var waitarrall = []
var Time = 0
var newArr
var statement
btn.addEventListener("click", function() {
btn1.style.display = "block"
content.innerHTML = ""
var value = input.value
//动态生成input
for (let i = 0; i < value; i++) {
var input3 = document.createElement("input")
var div = document.createElement("div")
content.appendChild(input3)
result.appendChild(div)
}
inputArr = document.querySelector('.content').children
for (let i = 0; i < inputArr.length; i++) {
inputArr[i].addEventListener("blur", function() {
var arr = this.value.trim().split(" ")
var obj = {}
obj.name = arr[0]
obj.createTime = arr[1]
obj.runTime = arr[2]
obj.priority = arr[3]
obj.status = "wait"
arrall.push(obj)
})
}
})
function print_info(newArr, Maxindex, index) {
statement = ""
let sortArr = []
newArr.forEach(item => {
sortArr.push(item.priority)
})
let string = sortArr.sort().join(" ")
statement = statement.concat("当前就绪进程:")
newArr.forEach(item => {
statement = statement.concat(item.name + " ")
})
statement = statement.concat("<br>")
statement = statement.concat("当前就绪线程优先级:" + string)
statement = statement.concat("<br>")
statement = statement.concat("时间Time:" + Time + ",进程" + newArr[Maxindex].name + "完成")
statement = statement.concat("<br>")
statement = statement.concat("--------------")
statement = statement.concat("<br>")
result.children[index].innerHTML = statement
}
function sortall(newArr, index) {
if (newArr.length != 0) {
let Max = 0
let Maxindex = 0
newArr.forEach((item, index) => {
if (item.priority > Max) {
Max = item.priority;
Maxindex = index
}
})
arrall.forEach(item => {
if (item.name === newArr[Maxindex].name) {
item.status = "ready"
Time = parseInt(item.runTime) + parseInt(Time)
}
})
print_info(newArr, Maxindex, index)
} else {
let Min = 99999
let Minindex = 0
let Max = 0
let Maxindex = 0
let someArr = []
waitarrall.forEach((item, index) => {
if (parseInt(item.createTime) <= Min) {
Min = parseInt(item.createTime);
Minindex = index
}
})
waitarrall.forEach(item => {
if (parseInt(item.createTime) === Min) {
someArr.push(item)
}
})
someArr.forEach((item, index) => {
if (item.priority > Max) {
Max = item.priority;
Maxindex = index
}
})
arrall.forEach(item => {
if (item.name === someArr[Maxindex].name) {
item.status = "ready"
Time = parseInt(item.createTime) + parseInt(item.runTime)
}
})
print_info(someArr, Maxindex, index)
}
}
function handle() {
for (let i = 0; i < result.children.length; i++) {
result.children[i].style.display = "block"
}
for (let i = 0; i < inputArr.length; i++) {
newArr = []
waitarrall = arrall.filter(item => item.status === "wait")
waitarrall.forEach((item, index) => {
if (parseInt(item.createTime) <= Time) {
newArr.push(item)
}
})
sortall(newArr, i)
}
alert("计算结束!")
}
btn1.addEventListener("click", handle)
</script>
</body>
</html>