UVa210 Concurrency Simulator(并行程序模拟) deque双端队列

ProLightsfx 2015-10-27 150 10/27
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

 


非特殊说明,本站所有文章均为博主原创,未经许可不得转载。

https://www.prolightsfxjh.com/

Thank you!

                                                                                                                                             ------from ProLightsfx

- THE END -
Tag:

ProLightsfx

11月16日09:16

最后修改:2024年11月16日
0

非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

共有 0 条评论