题意:对n个栈,有q次操作。每个操作可能为三种情况中的一种:1.将v插入到s栈的顶端;2.输出s栈的栈顶(若栈为空则输出empty);3.将栈t插入到栈s的栈顶。
开始考虑到指针可能会mle,用数组模拟链表来实现。迷之wa,中间少写一句,若s栈为空,则s栈的栈顶变为t栈的栈顶。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 const int maxn = 3e5+10; 6 struct node{ 7 long long data; 8 long long pre; 9 }arr[maxn]; 10 struct list{ 11 long long top; 12 long long head; 13 }lst[maxn]; 14 long long used; 15 16 void insert(long long s, long long v){ 17 arr[used].data = v; 18 arr[used].pre = lst[s].top; 19 lst[s].top = used; 20 if (lst[s].head == -1) 21 lst[s].head = used; 22 used++; 23 } 24 void pop(long long s){ 25 if (lst[s].top == -1) 26 printf("EMPTY "); 27 else{ 28 printf("%d ", arr[lst[s].top].data); 29 lst[s].top = arr[lst[s].top].pre; 30 if (lst[s].top == -1) 31 lst[s].head = -1; 32 } 33 } 34 void move(long long s, long long t){ //把t放到s上 35 if (lst[t].top != -1){ 36 arr[lst[t].head].pre = lst[s].top; 37 if (lst[s].top==-1) lst[s].head=lst[t].head; 38 lst[s].top = lst[t].top; 39 lst[t].top = lst[t].head = -1; 40 } 41 } 42 43 int main(){ 44 int T; 45 scanf("%d", &T); 46 47 while (T--){ 48 long long n,q; 49 scanf("%lld%lld", &n, &q); 50 used = 0; 51 memset(lst, -1, sizeof(lst)); 52 long long s,t,mod; 53 long long v; 54 while (q--){ 55 scanf("%lld", &mod); 56 if (mod == 1){ 57 scanf("%lld%lld", &s, &v); 58 insert(s, v); 59 } 60 else if (mod == 2){ 61 scanf("%lld", &s); 62 pop(s); 63 } 64 else { 65 scanf("%lld%lld", &s, &t); 66 move(s, t); 67 } 68 } 69 } 70 71 return 0; 72 }