思路:模拟运行,根据提议有两个队列,其中等待队列是双向队列
这道题关键是变量的定义,使用index来代表程序,再使用一个数组来存储每个程序执行到第几条
而每个程序就用vector来存储每条语句,每个程序又存储在一个vector里面
package test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Vector;
public class Test{
static boolean lock = false;//共用锁
static int N = 1005;//程序最大数目
static LinkedList<Integer> qr;//执行队列
static LinkedList<Integer> qb;//等待队列
static Vector<Vector<String>> prg = new Vector<Vector<String>>();
static int T[] = new int[5];//5条命令的执行时间
static int var[] = new int[26];//变量
static int p[] = new int[N];//每个程序执行到那条
static int lim;//时间片
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = null;
System.out.println("input:");
while(!"".equals((line=sc.nextLine().toLowerCase()))){
/*输入略*/
}
sc.close();
while(qr.size()>0||qb.size()>0){
int index = qr.poll();//准备执行的程序号
int rt = lim;//分配时间片
Vector<String> now = prg.get(index);
while(rt>0){
String s = now.get(p[index]);//当前程序的当前命令
if(!lock&&s.contains("=")){
int i = s.substring(0,s.indexOf("=")).charAt(0)-'a';
var[i] = Integer.valueOf(s.substring(s.indexOf("=")));
rt -= T[0];
}else if(!lock&&s.contains("print")){
int i = s.substring(0,s.indexOf(" ")).charAt(0)-'a';
System.out.println(var[i]);
rt -= T[1];
}else if(!lock&&s.contains("lock")){
rt -= T[2];
lock = true;
}else if(!lock&&s.contains("end")){
rt -= T[4];
}else if(s.contains("unlock")){
qr.addFirst(qb.poll());
lock = false;
break;
}else{
break;
}
p[index]++;
}
qr.add(index);//每次都将程序放到队尾
}
}
}