python非同步IO
阿新 • • 發佈:2020-07-18
實現一個雙鏈表,雙鏈表初始為空,支援5種操作:
(1) 在最左側插入一個數;
(2) 在最右側插入一個數;
(3) 將第k個插入的數刪除;
(4) 在第k個插入的數左側插入一個數;
(5) 在第k個插入的數右側插入一個數
現在要對該連結串列進行M次操作,進行完所有操作後,從左到右輸出整個連結串列。
注意:題目中第k個插入的數並不是指當前連結串列的第k個數。例如操作過程中一共插入了n個數,則按照插入的時間順序,這n個數依次為:第1個插入的數,第2個插入的數,…第n個插入的數。
輸入格式
第一行包含整數M,表示操作次數。
接下來M行,每行包含一個操作命令,操作命令可能為以下幾種:
(1) “L x”,表示在連結串列的最左端插入數x。
(2) “R x”,表示在連結串列的最右端插入數x。
(3) “D k”,表示將第k個插入的數刪除。
(4) “IL k x”,表示在第k個插入的數左側插入一個數。
(5) “IR k x”,表示在第k個插入的數右側插入一個數。
輸出格式
共一行,將整個連結串列從左到右輸出。
資料範圍
1≤M≤100000
所有操作保證合法。
輸入樣例:
10
R 7
D 1
L 3
IL 2 10
D 3
IL 2 7
L 8
R 9
IL 4 7
IR 2 2
輸出樣例:
8 7 7 3 2 9
定義:
e[N]:存放結點的val
l[N]:存放結點的左邊值
r[N]:存放結點的右邊值
idx:索引結點
初始化:讓0的右邊為1,一的左邊為0,即讓頭指標表示為0,讓尾指標表示為1,則index從2開始。
1 void init() 2 { 3 r[0] = 1; 4 l[1] = 0; 5 idx = 2; 6 }
題目中的各種insert操作:我們可以讓它們都轉化成插入在一個結點的右邊(通過傳入引數控制)。
1 void insert(int k, int x) 2 { 3 e[idx] = x; //接收值 4 r[idx] = r[k]; //新插入結點的右邊指向第k個結點的右邊結點 5 l[idx] = k; //新插入結點的左邊指向第k個結點6 l[r[k]] = idx; //第k個結點的右邊結點的左邊指向新插入結點 7 r[k] = idx; //第k個結點的右邊指向新插入結點 8 idx++; 9 }
刪除操作:
1 void remove(int k) 2 { 3 r[l[k]] = r[k]; //k的左邊結點的右邊指向k的右邊 4 l[r[k]] = l[k]; //k的右邊結點的左邊指向k的左邊 5 }
總程式碼,注意插入時傳參(因為idx從2開始,所以第k個結點的下標時k+1):
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 const int N = 100010; 6 int e[N], l[N], r[N], idx; 7 8 void init() 9 { 10 r[0] = 1; 11 l[1] = 0; 12 idx = 2; 13 } 14 15 void insert(int k, int x) 16 { 17 e[idx] = x; 18 r[idx] = r[k]; 19 l[idx] = k; 20 l[r[k]] = idx; 21 r[k] = idx; 22 idx++; 23 } 24 25 void remove(int k) 26 { 27 r[l[k]] = r[k]; //k的左邊結點的右邊指向k的右邊 28 l[r[k]] = l[k]; //k的右邊結點的左邊指向k的左邊 29 } 30 31 int main() 32 { 33 int m; 34 35 init(); 36 37 cin >> m; 38 while(m--) 39 { 40 string op; 41 cin >> op; 42 int k, x; 43 44 if(op == "L") 45 { 46 cin >> x; 47 insert(0, x); 48 } 49 else if(op == "R") 50 { 51 cin >> x; 52 insert(l[1], x); 53 } 54 else if(op == "D") 55 { 56 cin >> k; 57 remove(k+1); //因為idx = 2是第一個結點 所以第k個結點時k+1 58 } 59 else if(op == "IL") 60 { 61 cin >> k >> x; 62 insert(l[k+1], x); 63 } 64 else if(op == "IR") 65 { 66 cin >> k >> x; 67 insert(k+1, x); 68 } 69 } 70 71 for(int i = r[0]; i != 1; i = r[i]) cout << e[i] << " "; 72 cout << endl; 73 system("pause"); 74 return 0; 75 }