1. 程式人生 > >BUPT復試專題—進程管理

BUPT復試專題—進程管理

sca 題目 大小 clear style names 同時 狀態 小寫

題目描述

在操作系統中,進程管理是非常重要的工作。每個進程都有唯一的進程標識PID。每個進程都可以啟動子進程,此時我們稱該它本身是其子進程的父進程。除PID為0的進程之外,每個進程冇且只冇一個父進程。在這個任務中,你需要實 時維護操作系統運行中的三種基本操作:
1. FORK PID1 PID2:標識為PlD1的進程啟動了一個標識為PID2的子進程。
2. KILL PID:結朿標識為PID的進程。迠註意,與此冋時所有PID的子進程也將同時結朿。如果PID是不存在或己經結朿的進程,則不做任何操作。
3. QUERY PID:査詢標i只為PID的進程是否仍然存在。
在初始狀態下,系統只開啟了PID為0的進程,並且在任何情況下該進程不會結束。

輸入

輸入的第一行足一個整數T(<=50),表示輸入的數據組數。
每組測試數據的第一行足一個整數N (1~100),表示操作的數量。
接下來N行,每行按照上面的描述給出每個操作.輸入保證所有的進程的PID 都不相同,且一個進程結柬後不會被重新啟動。所有PID都足[0,100]之間的整數。

輸出

對於每個QUERY,如果查詢的進程仍然存在則輸出Yes,否則輸出No。輸出的大小寫必須和樣例一致。

樣例輸入

2
5
FORK 0 1
QUERY 1
KILL 1
QUERY 1
QUERY 2
1
QUERY 0

樣例輸出

Yes
No
No
No
Yes

來源

2014網研C題

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<map>
#include<vector>
using namespace std;
struct tree
{
    vector<int> i;
    int lable;
};
map<int,tree> donser;
void deal(int m)
{
    donser[m].lable=0;
    vector
<int> tep=donser[m].i; vector<int>::iterator it; while(tep.size()) { int a=tep.back(); tep.pop_back(); deal(a); } return; } int main() { int a,b; while(~scanf("%d",&a)) { while(a--) { cin>>b; while(b--) { string temp; cin>>temp; donser[0].lable=1; if(temp[0]==F) { int m,n; cin>>m>>n; donser[m].i.push_back(n); donser[m].lable=1; donser[n].lable=1; } else if(temp[0]==Q) { int m; cin>>m; if(donser[m].lable==1) cout<<"Yes"<<endl; else cout<<"No"<<endl; } else if(temp[0]==K) { int m; cin>>m; deal(m); } } donser.clear(); donser[0].lable=1; } } return 0; }

BUPT復試專題—進程管理