Stack is one of the most fundamental data structures, which is based on the principle of Last In First Out (LIFO).  The basic operations include Push (inserting an element onto the top position) and Pop (deleting the top element).  Now you are supposed to implement a stack with an extra operation: PeekMedian -- return the median value of all the elements in the stack.  With N elements, the median value is defined to be the (N/2)-th smallest element if N is even, or ((N+1)/2)-th if N is odd.

输入描述:

Each input file contains one test case.  For each case, the first line contains a positive integer N (<= 105).  Then N lines follow, each contains a command in one of the following 3 formats:
Push key
Pop
PeekMedian
where key is a positive integer no more than 105.

输出描述:

For each Push command, insert key into the stack and output nothing.  For each Pop or PeekMedian command, print in a line the corresponding returned value.  If the command is invalid, print "Invalid" instead.

输入例子:

17
Pop
PeekMedian
Push 3
PeekMedian
Push 2
PeekMedian
Push 1
PeekMedian
Pop
Pop
Push 5
Push 4
PeekMedian
Pop
Pop
Pop
Pop

输出例子:

Invalid
Invalid
3
2
2
1
2
4
4
5
3
Invalid

题解:一开始我的想法是用vector来模拟栈,排完序后输出中间的值,但是似乎vector的效率并不高

故超时,感觉思路没什么错误。。。

第一次超时代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
#include<vector>
using namespace std; int main()
{
stack<int>s;
vector<int>v;
vector<int>::iterator it; string str;
int n;
int k; cin>>n;
for(int t=0;t<n;t++)
{
cin>>str;
if(str=="Pop")
{
if(!s.empty())
{
printf("%d\n",s.top());
it=v.begin()+s.size()-1; v.erase(it);
s.pop();
}
else
{
printf("Invalid\n");
}
}
else if(str=="PeekMedian")
{
sort(v.begin(), v.end(),less<int>());
if(!s.empty())
{ if(s.size()%2==1)
{
it=v.begin()+(s.size()+1)/2-1;
printf("%d\n",*it);
}
else
{
it=v.begin()+s.size()/2-1;
printf("%d\n",*it);
}
}
else
{
printf("Invalid\n");
}
}
else
{
scanf("%d",&k);
s.push(k);
v.push_back(k);
} }
return 0;
}

换用set的排序功能可以降低复杂度

AC代码:

#include <iostream>
#include <vector>
#include <set>
#include <stack>
#include <cstring>
using namespace std; stack<int> stk;
multiset<int> set1,set2;
int mid; //set1存mid及以下的数,其大小应该与set2相等,或多1
void adjust(){
if(set1.size()<set2.size()){//将set2最小的移到set1
auto it=set2.begin();
set1.insert(*it);
set2.erase(it);
}else if(set1.size()>set2.size()+1){//将set1最大的移到set2
auto it=set1.end();
it--;
set2.insert(*it);
set1.erase(it);
}
//重新计算mid
if(!stk.empty()){
auto it=set1.end();
it--;
mid=*it;
}
} int main(){
int N;
scanf("%d",&N);
char ch[12];
int top,x;
while(N--){
scanf("%s",ch);
if(strcmp(ch,"Pop")==0){
if(stk.empty())
printf("Invalid\n");
else{
top=stk.top();
stk.pop();
printf("%d\n",top);
if(top<=mid)
set1.erase(set1.find(top));
else
set2.erase(set2.find(top));
adjust();
}
}else if(strcmp(ch,"PeekMedian")==0){
if(stk.empty())
printf("Invalid\n");
else
printf("%d\n",mid);
}else if(strcmp(ch,"Push")==0){
scanf("%d",&x);
stk.push(x);
if(stk.empty()){
set1.insert(x);
mid=x;
}else if(x<=mid)
set1.insert(x);
else
set2.insert(x);
adjust();
}else
printf("Invalid\n");
}
return 0;
}

Stack (30)(模拟栈,输出中间数用set)的更多相关文章

  1. c语言学习,模拟栈操作

    1.stack.c模拟栈操作函数的实现 #include<stdio.h> #include<stdlib.h> ; static char *stack;//数据栈 ;//栈 ...

  2. java模拟栈的操作

    栈是一种有序列表,可以使用数组的结构来储存栈的数据内容 思路 1. 创建一个栈类StackArray 2. 定义一个top来模拟栈顶,初始化为-1 3. 入栈: 当有数据加入到栈的时候 top++ s ...

  3. ACM/ICPC 之 用双向链表 or 模拟栈 解“栈混洗”问题-火车调度(TSH OJ - Train)

    本篇用双向链表和模拟栈混洗过程两种解答方式具体解答“栈混洗”的应用问题 有关栈混洗的定义和解释在此篇:手记-栈与队列相关 列车调度(Train) 描述 某列车调度站的铁道联接结构如Figure 1所示 ...

  4. 第一回写的用arraylist模拟栈操作

    package hashMap; import java.util.ArrayList; import d.Student; /** * 用ArrayList模拟栈操作 * @author zhuji ...

  5. HDOJ/HDU 1022 Train Problem I(模拟栈)

    Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot o ...

  6. 使用golang的slice来模拟栈

    slice(切片):底层数据结构是数组 stack(栈):一种先进后出的数据结构 普通版的模拟写入和读取的栈 package main import "fmt" //栈的特点是先进 ...

  7. 【PAT甲级】1057 Stack (30 分)(分块)

    题意: 输入一个正整数N(<=1e5),接着输入N行字符串,模拟栈的操作,非入栈操作时输出中位数.(总数为偶数时输入偏小的) trick: 分块操作节约时间 AAAAAccepted code: ...

  8. java 16 - 5 LinkedList模拟栈数据结构的集合

    请用LinkedList模拟栈数据结构的集合,并测试 题目的意思是: 你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟. package cn_LinkedList; impo ...

  9. 【DataStructure In Python】Python模拟栈和队列

    用Python模拟栈和队列主要是利用List,当然也可以使用collection的deque.以下内容为栈: #! /usr/bin/env python # DataStructure Stack ...

随机推荐

  1. JS 本地存储笔记

    本地存储     1.数据存储在用户浏览器中的     2.设置.读取方便.甚至刷新都不会丢失数据     3.容量比较大,sessionStorange约5M,localstorage约20M    ...

  2. 谈谈集成测试(integration testing)

    对于软件开发来说,软件测试是一个几乎贯穿所有阶段的活动,所以测试的重要性毋庸置疑.不同开发组织如何在不同的产品研发阶段进行测试,也在很大程度上反映了其研发能力和质量控制能力.软件测试有很多类型,包括单 ...

  3. 将Asp.Net Core3.1项目,使用Docker 部署到Centos 8

    一.准备工具 Win 10 Centos 8 Visual Studio 2019 Docker Desktop  下载地址:https://download.docker.com/win/stabl ...

  4. 01第一个批处理文件 window开机自动加载批处理文件

    1 批处理文件用来加载python程序  批处理的文件名称为:Hello.bat @echo off C: cd C:\Users\\Desktop\python\HelloWorld\HelloWo ...

  5. Java学习书籍与社区

    编码规范:<阿里巴巴Java开发手册> 技术架构:<大型网站技术架构核心原理与案例分析>---李智慧 Spring架构与设计原理解析:<Spring技术内幕深入解析Spr ...

  6. Docker服务开放了这个端口,服务器分分钟变肉机

    之前有很多朋友提过,当使用docker-maven-plugin打包SpringBoot应用的Docker镜像时,服务器需要开放2375端口.由于开放了端口没有做任何安全保护,会引起安全漏洞,被人入侵 ...

  7. 封装react antd的form表单组件

    form表单在我们日常的开发过程中被使用到的概率还是很大的,比如包含了登录.注册.修改个人信息.新增修改业务数据等的公司内部管理系统.而在使用时这些表单的样式如高度.上下边距.边框.圆角.阴影.高亮等 ...

  8. Tensorflow Cpu不支持AVX

    Tensorflow从1.6开始从AVX编译二进制文件,所以如果你的CPU不支持AVX 你需要 从源码编译 下载旧版 从源码编译比较麻烦,如果你是初学的话,我建议使用旧版. 安装旧版: pip3 in ...

  9. Linux与Windows的区别(后面了解后继续更新)

    1.转自知乎上的@Haoyuan Xing得答案: Linux是一个以开发者为中心的操作系统,Windows是以消费者为中心的操作系统.这是最根本的区别,也是Linux相对于Windows的优势/劣势 ...

  10. Android popupwindow在低版本手机上无法显示

    popupwindow偶尔的显示失效(在低版本Android系统的手机上,测试机6.0)实在是坑害了不少人,害,而且坑了for a long time.本小白就是其中一个受害者. 百度了N久N多还是没 ...