题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4016

直接用栈爆内存,看网上大神用数组实现的,构思巧妙,学习了!

AC代码:

/*
* 用数组实现栈的一些操作
*/
#include <cstdio>
#include <cstring> using namespace std; const int maxn = 300005; int arr[maxn]; //存放所有的数据 //top代表栈顶元素在arr中的下标,
//Next代表栈顶元素下一个元素在arr中的下标,用于实现在栈顶元素被抛出后,栈顶新的指向,
//bottom代表栈低元素在arr中的位置
int top[maxn], Next[maxn], bottom[maxn]; int main() {
int T;
scanf("%d", &T);
int n, q;
int op, cnt;
int s, v, t;
while (T--) {
cnt = 0;
memset(top, 0, sizeof(top));
memset(Next, 0, sizeof(Next));
memset(bottom, 0, sizeof(bottom));
scanf("%d%d", &n, &q);
while (q--) {
scanf("%d", &op);
if (op == 1) {
scanf("%d%d", &s, &v);
arr[++cnt] = v;
if (bottom[s] == 0) { //如果原先栈为空,新加入的第一个元素将成为栈底元素
bottom[s] = cnt;
}
//更新栈顶元素和栈顶的下一个元素
Next[cnt] = top[s]; //也可写作Next[top[s]] = top[s];
top[s] = cnt;
} else if (op == 2) {
scanf("%d", &s);
if (top[s]) {
printf("%d\n", arr[top[s]]); //抛出栈顶元素,注意,top存放的是栈顶元素在arr中的下标
top[s] = Next[top[s]]; //栈顶元素重定向
if (top[s] == 0) { //若栈为空,则栈顶和栈底都置为0,容易忽略这个判断
bottom[s] = 0;
}
} else {
printf("EMPTY\n");
}
} else if (op == 3) {
scanf("%d%d", &s, &t);
if (top[t]) {
if (bottom[s] == 0) { //如果第s个栈为空,则s的栈底就是t的栈底
bottom[s] = bottom[t];
}
//t的栈底元素的下一个为s的栈顶元素,这里不用在重定向s栈顶元素的下一个元素,因为t已经指定过了
Next[bottom[t]] = top[s];
top[s] = top[t];
}
top[t] = bottom[t] = 0; //把第t个栈置为空,容易忽略
}
}
}
return 0;
}

又看到网上一个用list实现的

#include <cstdio>
#include <list> using namespace std;
const int maxn = 3e5 + 5;
list<int> l[maxn]; int main() {
int n, t, q;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++)
l[i].clear();
while (q--) {
int op, s, v, t;
scanf("%d", &op);
if (op == 1) {
scanf("%d%d", &s, &v);
l[s].push_back(v);
} else if (op == 2) {
scanf("%d", &s);
if (l[s].empty()) printf("EMPTY\n");
else {
printf("%d\n", l[s].back());
l[s].pop_back();
}
} else if (op == 3) {
scanf("%d%d", &s, &t);
l[s].splice(l[s].end(), l[t]); //splice 直接进行合并不进行排序,merge默认升序合并排序
}
}
}
return 0;
}

我写的代码,不能AC

/*
* Memory Limit Exceeded
*/
#include <stack>
#include <cstdio> using namespace std; const int maxn = 300005; stack<int> arr[maxn]; int maze[maxn]; int x, y, z; void solve_push(int y, int z) {
arr[y].push(z);
} void solve_top(int y) {
if (!arr[y].empty()) {
int x = arr[y].top();
arr[y].pop();
printf("%d\n", x);
} else {
printf("EMPTY\n");
}
} void solve_move(int y, int z) {
stack<int> temp;
int x;
while (!arr[z].empty()) {
x = arr[z].top();
arr[z].pop();
temp.push(x);
}
while (!temp.empty()) {
x = temp.top();
temp.pop();
arr[y].push(x);
}
} int main() {
int t;
int n, q;
int flag; scanf("%d", &t);
while (t--) {
flag = 0;
scanf("%d%d", &n, &q);
for (int i = 0; i < q; i++) {
scanf("%d", &x);
if (x == 1) {
scanf("%d%d", &y, &z);
maze[flag++] = y;
solve_push(y, z);
}
if (x == 2) {
scanf("%d", &y);
maze[flag++] = y;
solve_top(y);
}
if (x == 3) {
scanf("%d%d", &y, &z);
maze[flag++] = y;
maze[flag++] = z;
solve_move(y, z);
}
}
for (int i = 0; i < flag; i++) {
while (!arr[maze[flag]].empty()) {
arr[maze[flag]].pop();
}
}
}
return 0;
}

[ZOJ 4016] Mergable Stack的更多相关文章

  1. ZOJ - 4016 Mergeable Stack 【LIST】

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4016 题意 模拟栈的三种操作 第一种 push 将指定元素压入指 ...

  2. ZOJ 4016 Mergeable Stack(利用list模拟多个栈的合并,STL的应用,splice函数!!!)

    Mergeable Stack Time Limit: 2 Seconds      Memory Limit: 65536 KB Given initially empty stacks, ther ...

  3. ZOJ 4016 Mergeable Stack(栈的数组实现)

    Mergeable Stack Time Limit: 2 Seconds      Memory Limit: 65536 KB Given  initially empty stacks, the ...

  4. ZOJ - 4016 Mergeable Stack (STL 双向链表)

    [传送门]http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4016 [题目大意]初始有n个空栈,现在有如下三种操作: (1) ...

  5. ZOJ 4016 Mergeable Stack 链表

    Mergeable Stack Time Limit: 2 Seconds      Memory Limit: 65536 KB Given  initially empty stacks, the ...

  6. ZOJ 4016 Mergeable Stack(from The 18th Zhejiang University Programming Contest Sponsored by TuSimple)

    模拟题,用链表来进行模拟 # include <stdio.h> # include <stdlib.h> typedef struct node { int num; str ...

  7. Mergeable Stack ZOJ - 4016(list)

    ZOJ - 4016 vector又T又M list是以链表的方式存储的 是一个双向链表 元素转移操作中,不能一个个遍历加入到s中,list独有的splic函数可以在常数时间内实现合并(并删除源lis ...

  8. zoj 3210 A Stack or A Queue? (数据结构水题)

     A Stack or A Queue? Time Limit: 1 Second      Memory Limit: 32768 KB Do you know stack and queue? ...

  9. ZOJ 3210 A Stack or A Queue?

    A Stack or A Queue? Time Limit: 1 Second      Memory Limit: 32768 KB Do you know stack and queue? Th ...

随机推荐

  1. Java多线中基础知识整理

    Java多线程中相关术语: 一.Java多线程原则 1.原子性:一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.一般使用线程同步或者Lock锁来确保. 2.可见性(J ...

  2. 微信小程序区分点击,长按事件

    在上代码之前,微信小程序点击事件,长按事件的触发顺序需要我们了解一下下 事务分类 touchstart:手指触摸 longtap:手指触摸后后,超过350ms离开 touchend:手指触摸动作结束 ...

  3. 使用re开发python计算器

    #!/usr/bin/env python import reimport functools def minus_operator_handler(formula): '''处理一些特殊的减号运算' ...

  4. [开发笔记]--把input框设置成font-size:0埋下的坑。

    vue项目上开发了一个输入pin码的组件.在某些安卓机器上.用户点击键盘后会自动失去焦点自动收起键盘.经过排查,发现是css属性font-size设置成0导致的.

  5. Redis 开发规范

    本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 键值设计 命令使用 客户端使用 相关工具 通过本文的介绍可以减少使用Redis过程带来的问题. 一.键值设计 1.key名设计 ...

  6. orcl数据库锁等级研究小记

    上周通过orcl 悲观锁的方式解决了一个并发临界值的问题.现在来研究下orcl各中锁的机制以及如何手动释放锁. 首先,通过查阅资料,先了解下数据的的各种操作语言分类. SQL语言共分为四大类:数据查询 ...

  7. eclipse导出可供项目引用的jar

    有两种,一种是导出直接可以运行的jar,一种是导出来供其他项目引用的.在这里,说的是第二种,第一种在我博客上面也有一篇转载的.1选中项目,选择Export 2选择JAR file 然后Next 3 s ...

  8. 【数据结构】算法 LinkList (Reverse LinkedList) Java

    反转链表,该链表为单链表. head 节点指向的是头节点. 最简单的方法,就是建一个新链表,将原来链表的节点一个个找到,并且使用头插法插入新链表.时间复杂度也就是O(n),空间复杂度就需要定义2个节点 ...

  9. 使用jconsole监控JVM内存

    首先声明:此篇博文分析的是JDK1.8. JVM内存区域总体分两类:heap区和非heap区.Jconsole中对内存划分为同样的结构,如下: heap区又分为:  - Eden Space(伊甸园) ...

  10. VS2017不能弹出安装界面的原因.

    如果这里选中了放大.100%入坑 解决办法:  禁用视觉主题,和元素,即可安装正常