LRJ入門經(jīng)典(基礎(chǔ)篇)——1.并行程序模擬

1.并行程序模擬

問(wèn)題描述:
給定n個(gè)程序澎粟,每種程序有五種操作奇昙,分別為 var = constant(賦值),print var (打印)群叶, lock, unlock吃挑,end
變量用小寫字母表示,初始化為0街立,為程序所公有(一個(gè)程序里對(duì)某個(gè)變量修改可以會(huì)影響其他程序里的這個(gè)變量)舶衬,
常數(shù)小于100(也就是說(shuō)最多兩位數(shù))。
每個(gè)時(shí)刻都只能有一個(gè)程序處于運(yùn)行狀態(tài)赎离,其他的都在等待逛犹,上述五種操作用時(shí)分別是t1, t2, t3, t4, t5。運(yùn)行中的程序,
每次最多能運(yùn)行q個(gè)時(shí)間虽画,當(dāng)q個(gè)時(shí)間被用完后舞蔽,它會(huì)被放在等待隊(duì)列的尾部,然后再?gòu)氖撞咳〕鲆粋€(gè)程序運(yùn)行码撰,初始等待隊(duì)列按輸入順序渗柿,
但是lock和unlock會(huì)改變順序,它們總是成對(duì)出現(xiàn)脖岛,不會(huì)出現(xiàn)嵌套朵栖。如果某個(gè)程序已經(jīng)執(zhí)行了lock,后面還有程序執(zhí)行l(wèi)ock柴梆,
那么這個(gè)程序就會(huì)馬上被放到一個(gè)阻止隊(duì)列的尾部(當(dāng)然如果運(yùn)行時(shí)間還沒(méi)用完也就浪費(fèi)了)陨溅。當(dāng)unlock結(jié)束后,阻止隊(duì)列中的第一個(gè)程序進(jìn)入等待隊(duì)列的首部轩性。
問(wèn)你程序的運(yùn)行結(jié)果是什么声登,輸出格式是第幾個(gè)程序加冒號(hào)加空格加結(jié)果狠鸳,兩個(gè)相連的數(shù)據(jù)用空行隔開揣苏。(詳見第二版p139)
分析:
對(duì)STL queue和deque的應(yīng)用

#include<iostream>
#include<deque>
#include<cstdio>
#include<string>
#include<queue>
#include<sstream>
using namespace std;

struct Program{
    int num;//程序號(hào)
    queue<string> code;//程序代碼
    Program(int num):num(num){};//成員變量初始化
};

int main(){
    int T;
    cout<<"times of test"<<endl;
    cin>>T;
    while(T--){
        int t1,t2,t3,t4,t5,n,q;
        int toTime[130];
        bool isLock = false;
        deque<Program> wait;//等待隊(duì)列
        queue<Program> stop;//阻止隊(duì)列
        cin>>n>>t1>>t2>>t3>>t4>>t5>>q;//輸入程序數(shù)和各個(gè)指令的執(zhí)行時(shí)間最后輸入配額時(shí)間
        getchar();//處理?yè)Q行符

        //每條命令對(duì)應(yīng)的執(zhí)行時(shí)間
        toTime['v'] = t1;
        toTime['p'] = t2;
        toTime['l'] = t3;
        toTime['u'] = t4;
        toTime['e'] = t5;

        //輸入程序代碼
        for(int i=0;i<n;i++){
            string s;
            Program program(i+1);
            cout<<"input "<<i+1<<"th program,end with 'end'"<<endl;
            while(1){
                getline(cin,s);
                program.code.push(s);
                //cout<<program.code.front()<<endl;
                //cout<<program.code.size();
                if(s == "end")
                    break;
            }
            //放入等待隊(duì)列中
            wait.push_back(program);

        }


        //模擬執(zhí)行
        while(!wait.empty()){
            //取隊(duì)列的隊(duì)首程序
            Program program = wait.front();
            wait.pop_front();
            //取配額時(shí)間
            int t = q;

            while(!program.code.empty()){
                //取第一句代碼
                string s = program.code.front();
                if(s[0] == 'v'){//賦值語(yǔ)句
                    if(toTime['v'] > t) {//程序的執(zhí)行時(shí)間不夠
                        wait.push_back(program);//則插入到等待隊(duì)列的隊(duì)尾
                        break;
                    }else{//執(zhí)行時(shí)間夠則
                        t = t - toTime['v'];//配額減掉執(zhí)行時(shí)間
                        cout<<program.num<<":"<<" "<<s<<endl;//輸出
                        program.code.pop();//刪除該語(yǔ)句
                    }
                }

                if(s[0] == 'p'){//邏輯同賦值語(yǔ)句
                    if(toTime['p'] > t) {
                        wait.push_back(program);
                        break;
                    }else{
                        t = t - toTime['p'];
                        cout<<program.num<<":"<<" "<<s<<endl;
                         program.code.pop();
                    }

                }


                if(s[0] == 'l'){
                    if(toTime['l'] > t) {
                        wait.push_back(program);
                        break;
                    }else{//執(zhí)行時(shí)間夠
                        if(isLock){ //已經(jīng)執(zhí)行過(guò)lock
                            stop.push(program);//則將程序放入到阻止隊(duì)列
                            break;
                        }else{//未執(zhí)行過(guò)lock
                            isLock = true;//執(zhí)行鎖指令
                            program.code.pop();//刪除該句代碼
                            t -= toTime['l'];
                            cout<<program.num<<":"<<" "<<s<<endl;   
                        }
                    }
                }

                if(s[0] == 'u'){
                    if(toTime['u'] > t){
                        wait.push_back(program);
                        break;
                    }else{
                        if(isLock){//變量被鎖則
                            isLock = false;//解鎖
                            program.code.pop();//刪除該句代碼
                            t -= toTime['u'];
                            cout<<program.num<<":"<<" "<<s<<endl;
                            if(!stop.empty()){//阻止隊(duì)列不為空
                                wait.push_front(stop.front());//將阻止隊(duì)列隊(duì)首插入到等待隊(duì)列隊(duì)首
                                stop.pop();//刪除阻止隊(duì)列的隊(duì)首
                            }

                        }else{
                            cout<<"程序出錯(cuò)件舵,unlock在lock之前"<<endl;
                        }

                    }

                }


                if(s[0] == 'e'){
                    //cout<<program.num<<":"<<" "<<s<<endl;
                    //break;
                    if(toTime['e'] > t) {
                        wait.push_back(program);
                        break;
                    }else{
                        cout<<program.num<<":"<<" "<<s<<endl;
                        //program = wait.front();
                        break;
                    }
                }
            }
        }

    }
    return 0;
}

測(cè)試數(shù)據(jù)

1
2 1 1 1 1 1 1
var
print
lock
unlock
end
var
print
lock
unlock
end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卸察,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子铅祸,更是在濱河造成了極大的恐慌坑质,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件临梗,死亡現(xiàn)場(chǎng)離奇詭異涡扼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)盟庞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門吃沪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人什猖,你說(shuō)我怎么就攤上這事票彪。” “怎么了不狮?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵降铸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我摇零,道長(zhǎng)推掸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮谅畅,結(jié)果婚禮上俊嗽,老公的妹妹穿的比我還像新娘。我一直安慰自己铃彰,他們只是感情好绍豁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牙捉,像睡著了一般竹揍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上邪铲,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天芬位,我揣著相機(jī)與錄音,去河邊找鬼带到。 笑死昧碉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的揽惹。 我是一名探鬼主播被饿,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搪搏!你這毒婦竟也來(lái)了狭握?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤疯溺,失蹤者是張志新(化名)和其女友劉穎论颅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囱嫩,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恃疯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了墨闲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片今妄。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖损俭,靈堂內(nèi)的尸體忽然破棺而出蛙奖,到底是詐尸還是另有隱情,我是刑警寧澤杆兵,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布雁仲,位于F島的核電站,受9級(jí)特大地震影響琐脏,放射性物質(zhì)發(fā)生泄漏攒砖。R本人自食惡果不足惜缸兔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吹艇。 院中可真熱鬧惰蜜,春花似錦、人聲如沸受神。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鼻听。三九已至财著,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撑碴,已是汗流浹背撑教。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留醉拓,地道東北人伟姐。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像亿卤,于是被迫代替她去往敵國(guó)和親愤兵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容