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

【传送门】http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4016

【题目大意】初始有n个空栈,现在有如下三种操作:

(1) 1 s v  即 s.push(v)

(2) 2 s 即 s.pop() 输出弹出的元素,如果栈s为空则输出 "EMPTY"

(3) 3 s t 把t栈元素全部移到s栈中,使s的尾部与t的首部相连。

现在有若干上述三种类型的操作,遇到操作2则输出相应内容。

【题解】由于站的数量n和操作次数q的数量级都达到1e5,建这么多栈取模拟上述三种操作是不明智的,特别是对于操作2,还要设置一个辅助栈来把元素按序移动到s栈。其实看到操作2就应该想到这应该是用链表实现,而且是双向链表,时间复杂度O(1)

核心方法调用:

assign() 给list赋值 
back() 返回最后一个元素 
begin() 返回指向第一个元素的迭代器 
clear() 删除所有元素 
empty() 如果list是空的则返回true 
end() 返回末尾的迭代器 
erase() 删除一个元素 
front() 返回第一个元素 
get_allocator() 返回list的配置器 
insert() 插入一个元素到list中 
max_size() 返回list能容纳的最大元素数量 
merge() 合并两个list 
pop_back() 删除最后一个元素 
pop_front() 删除第一个元素 
push_back() 在list的末尾添加一个元素 
push_front() 在list的头部添加一个元素 
rbegin() 返回指向第一个元素的逆向迭代器 
remove() 从list删除元素 
remove_if() 按指定条件删除元素 
rend() 指向list末尾的逆向迭代器 
resize() 改变list的大小 
reverse() 把list的元素倒转 
size() 返回list中的元素个数 
sort() 给list排序 
splice() 合并两个list 
swap() 交换两个list 
unique() 删除list中重复的元素

【代码】

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <list>

using namespace std;
#define maxsize 300005
list <int> st[maxsize];

int main()
{
    int cas;
    scanf("%d",&cas);
    while(cas--)
    {
        for(int i=0;i<maxsize;i++)
        {
            st[i].clear();
        }
        int n,q;
        scanf("%d%d",&n,&q);
        int a,b,c;
        while(q--)
        {
            scanf("%d",&a);
            if(a == 1)
            {
                scanf("%d%d",&b,&c);
                st[b].push_back(c);
            }
            if(a == 2)
            {
                scanf("%d",&b);
                if(st[b].empty())
                {
                    printf("EMPTY\n");
                }
                else
                {
                    printf("%d\n",st[b].back());
                    st[b].pop_back();
                }

            }
            if(a == 3)
            {
                scanf("%d%d",&b,&c);
                st[b].splice(st[b].end(),st[c]);
            }

        }
    }
     return 0;
}

原文地址:https://www.cnblogs.com/czsharecode/p/9606564.html

时间: 2024-10-11 19:51:09

ZOJ - 4016 Mergeable Stack (STL 双向链表)的相关文章

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

Mergeable Stack Time Limit: 2 Seconds      Memory Limit: 65536 KB Given initially empty stacks, there are three types of operations: 1 s v: Push the value onto the top of the -th stack. 2 s: Pop the topmost value out of the -th stack, and print that

ZOJ - 4016 Mergeable Stack 【链表合并】

Given  initially empty stacks, there are three types of operations: 1 s v: Push the value  onto the top of the -th stack. 2 s: Pop the topmost value out of the -th stack, and print that value. If the -th stack is empty, pop nothing and print "EMPTY&q

[ZOJ 4016] Mergable Stack

题目链接: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代表栈

ZOJ 3210 A Stack or A Queue? (I)

A Stack or A Queue? Time Limit: 1 Second      Memory Limit: 32768 KB Do you know stack and queue? They're both important data structures. A stack is a "first in last out" (FILO) data structure and a queue is a "first in first out" (FIF

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? They're both important data structures. A stack is a "first in last out" (FILO) data structure and a queue is a "first in first out" (

stack(STL)

//Stack STL //在STL中,栈是以别的容器作为底部结构,再将 //接口改变,使之符合栈的特性 //一共5个常用操作函数 //构造析构 stack<Elem>c; //build a empty stack stack<Elem>c1(c2); //copy a stack //5 functions c.top(); //return the element at the top of the stack c.push(elem); //push element at

数据结构--stack 基于双向链表实现(超简单版)

1 package cn.it.struct; 2 3 public class MyStack<T> { 4 private int top=-1; 5 6 private Node<T> current; 7 8 9 private class Node<T>{ 10 private T data; 11 12 private Node<T> next; 13 14 private Node<T> pre; 15 16 } 17 18 //初

ZOJ 3210: A Stack or A Queue?

A Stack or A Queue? ///@author Sycamore, ZJNU ///@date 2017-02-09  #include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int T, N; cin >> T; while (T--) { cin >> N; vector<int>v(N); f

ZOJ 3210 A Stack or A Queue ? 水

C - A Stack or A Queue? Time Limit:1000MS    Memory Limit:32768KB    64bit IO Format:%lld & %llu SubmitStatus Description Do you know stack and queue? They're both important data structures. A stack is a "first in last out" (FILO) data struc