天天看點

UVa 210 Concurrency Simulator(雙端隊列)

思路:模拟運作,根據提議有兩個隊列,其中等待隊列是雙向隊列

這道題關鍵是變量的定義,使用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);//每次都将程式放到隊尾
		}			
	}
}