Concurrency Simulator(并行程序模拟)deque双端队列
deque 双端队列
支持快速随机访问。在 头尾位置 插入/删除速度很快。deque是一种更为复杂的数据结构。与string和vector类似,deque支持快速的随机访问。与string和vector一样,在deque的中间位置添加和删除元素的代价(可能)很高。但是,在deque的两端添加或删除元素都是很快的,与list或forward_list添加删除元素的速度相当。
from C++ Primer 5th
Solution
解决方法主要来自另一个地方http://blog.csdn.net/acvay/article/details/43054111,
自己修改了小部分,增加了自己的理解和解析:
#include
#include
#include
#include
#include
#include
#include // memset(,,) 是在这里面的
using namespace std;
const int N = 1005;
//这些变量都定义成全局,只要是函数里面要用到的东西比较多,总不能给函数那么多的参数吧,这么做挺好的
bool lock;
deque qr;//等待队列 把每个队列,用给队列的序号来记录、处理
queue qb;//阻止队列
vector prg[N];
string s;
int t[N], p[N], var[26]/*可以用26个字母代替26个数字,因为变量最多只有26个*/, lim;
//m[26]等,把二十六个字母转化为数字来进行储存和处理,很常用的
void run(int i)//每一次执行配额时间(单位时间)
{
int rt = lim, v; //copy一份配额(单位时间),这样可以在使用的时候保留原来的标准lim配额
string cur;
while(rt > 0){
cur = prg[i][p[i]];
if(cur[2] == '='){ // 赋值
rt -= t[0];
v = cur[4] - '0';
if(cur.size() == 6) v = v * 10 + cur[5] - '0';//!常数是小于100的数,所以最多是两位数。故.size()==6就是两位了
var[cur[0] - 'a'] = v; //!给变量赋值了 ,且把字母化为数字来存储了
}
else if(cur[2] == 'i'){ //print
rt -= t[1];
printf("%d: %dn", i, var[cur[6] - 'a']); //打印的只会是单个的字母 所对应 的变量 的值
}
else if(cur[2] == 'c'){ //lock
rt -= t[2];
if(lock){
qb.push(i); //!queue用的.push() 而不用push_back()
return; //直接进入下一个程序的运行
}
else lock = true;
}
else if(cur[2] == 'l'){ //unlock
lock = false;
rt -= t[3];
if(!qb.empty()){ //阻止队列
v = qb.front(); //的第一个
qb.pop(); //程序进入
qr.push_front(v);
}
}
else return; //end 如果到这里,说明它运行了 end 可以直接退出函数
++p[i];
}
qr.push_back(i); //main()里面有qr.pop_front(i)了,这样就把它放到末尾了
}
int main()
{
int cas, n;
scanf("%d", &cas);
while(cas--){
scanf("%d", &n);
for(int i = 0; i < 5; ++i)
scanf("%d", &t[i]);
scanf("%d", &lim);
for(int i = 1; i <= n; ++i){ //队列名总不能从0开始
prg[i].clear();
while(getline(cin, s)){
if(s == "") continue; //i记录的是队列的序号
prg[i].push_back(s);
if(prg[i].back() == "end") break;//.back() 和 .front()
}
qr.push_back(i); //这个不要漏掉
}
memset(p, 0, sizeof(p));
memset(var, 0, sizeof(var));
while(!qr.empty()){
int cur = qr.front();
qr.pop_front();
run(cur);
}
if(cas) puts("");
}
return 0;
}
//!@ProLights
- THE END -
最后修改:2024年11月16日
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
如经许可后转载,请注明出处:https://prolightsfxjh.com/article/uva210-concurrency-simulator/
共有 0 条评论