Mergeable Stack
这题是:模拟一个栈的题目:
输入: T -示例
n -栈的个数 m - 操作
op - 操作指令 No ( 对 第几个栈来说 ) num(元素或者No栈)
op==1 对第几个栈压进一个num的元素
op==2 对把第几个栈的栈顶移去一个元素并显示出来。
op==3 对 No1 No2 把No2的移到No1的顶部。
这里就稍微说一下splice的用法,就是将链表A和B拼接在一起,并且将链表B中的元素清空。
A.splice(postion,B);postion代表从A的哪个位置开始拼接
尊重原创:以下代码是参考(na):https://blog.csdn.net/Eternally831143/article/details/79869725
#include <iostream> #include <stdio.h> #include <list> using namespace std; typedef long long ll; const int N = 3e5+3; list<int> list1 [N]; int main() { // freopen("in.txt","r",stdin); int T,op,s,t,v; cin>>T; while(T--) { int n,q; scanf("%d%d",&n,&q); for(int i = 1; i <= n; ++i)//这一步也很重要,不要忘了 list1[i].clear(); while (q--) { scanf("%d",&op); if(op==1){ scanf("%d%d",&s,&v); list1[s].push_back(v); }else if(op==2){ scanf("%d",&s); if(!list1[s].empty()){ printf("%d\n",list1[s].back()); list1[s].pop_back(); }else printf("EMPTY\n"); }else if(op==3){ scanf("%d%d",&s,&t); //将栈t里的每一个元素按顺序移到栈s顶部 list1[s].splice(list1[s].end(),list1[t]); } } } return 0; }