uva 210 Concurrency Simulator (并行堆栈模拟)

本文介绍了一种利用Deque双端队列来模拟程序编译和执行过程的方法。通过Java实现了一个模拟系统,该系统可以处理包括赋值、条件判断等基本指令,并考虑了锁的获取与释放等操作。模拟器接受用户输入的程序代码并按照时间顺序执行,展示程序运行状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模拟一下就好了,可以用Deque双端队列

import java.util.Arrays;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	static int[] time = new int[129];
	static int[] ch = new int[26];
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int T = scan.nextInt();
		while(T--!=0){
			Arrays.fill(time, 0);
			Arrays.fill(ch, 0);
			int n = scan.nextInt();
			int t1 = scan.nextInt();
			int t2 = scan.nextInt();
			int t3 = scan.nextInt();
			int t4 = scan.nextInt();
			int t5 = scan.nextInt();
			int Q = scan.nextInt();
			
			time['='] = t1;
			time['i'] = t2;
			time['c'] = t3;
			time['l'] = t4;
			time['d'] = t5;
			scan.nextLine();
			Deque<Program> wait = new LinkedList<>();
			Queue<Program> stop = new LinkedList<>();
			for(int i=1;i<=n;i++){
				Program program = new Program();
				program.number = i;
				while(true){
					String s = scan.nextLine();
					program.code.add(s);
					if("end".equals(s))break;
				}
				wait.add(program);
			}
			
			boolean isLock = false;
			while(!wait.isEmpty()){
				//System.out.println("1");
				Program program =wait.poll();
				int t = Q;
				while(!program.code.isEmpty()){
					if(t<=0){
						wait.add(program);
						break;
					}
					String s = program.code.peek();
					if(s.charAt(2)=='c'){
						if(isLock){
							stop.add(program);
							break;
						}else{
							isLock = true;
						}
					}
					t-=time[s.charAt(2)];
					program.code.poll();
					if(s.charAt(2)=='='){
						char c = s.charAt(0);
						int num = Integer.parseInt(s.substring(4));
						ch[c-'a'] = num;
					}
					if(s.charAt(2)=='d'){
						break;
					}
					if(s.charAt(2)=='l'){
						isLock = false;
						if(!stop.isEmpty()){
							wait.addFirst(stop.poll());
						}
					}
					if(s.charAt(2)=='i'){
						char c = s.charAt(6);
						System.out.println(program.number+": "+ch[c-'a']);
					}
				}
			}
			if(T!=0){
				System.out.println();
			}
		}
	}

	static class Program{
		int number;
		Queue<String> code = new LinkedList<>();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值