Stack (30)(模拟栈,输出中间数用set)
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)的更多相关文章
- c语言学习,模拟栈操作
1.stack.c模拟栈操作函数的实现 #include<stdio.h> #include<stdlib.h> ; static char *stack;//数据栈 ;//栈 ...
- java模拟栈的操作
栈是一种有序列表,可以使用数组的结构来储存栈的数据内容 思路 1. 创建一个栈类StackArray 2. 定义一个top来模拟栈顶,初始化为-1 3. 入栈: 当有数据加入到栈的时候 top++ s ...
- ACM/ICPC 之 用双向链表 or 模拟栈 解“栈混洗”问题-火车调度(TSH OJ - Train)
本篇用双向链表和模拟栈混洗过程两种解答方式具体解答“栈混洗”的应用问题 有关栈混洗的定义和解释在此篇:手记-栈与队列相关 列车调度(Train) 描述 某列车调度站的铁道联接结构如Figure 1所示 ...
- 第一回写的用arraylist模拟栈操作
package hashMap; import java.util.ArrayList; import d.Student; /** * 用ArrayList模拟栈操作 * @author zhuji ...
- HDOJ/HDU 1022 Train Problem I(模拟栈)
Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot o ...
- 使用golang的slice来模拟栈
slice(切片):底层数据结构是数组 stack(栈):一种先进后出的数据结构 普通版的模拟写入和读取的栈 package main import "fmt" //栈的特点是先进 ...
- 【PAT甲级】1057 Stack (30 分)(分块)
题意: 输入一个正整数N(<=1e5),接着输入N行字符串,模拟栈的操作,非入栈操作时输出中位数.(总数为偶数时输入偏小的) trick: 分块操作节约时间 AAAAAccepted code: ...
- java 16 - 5 LinkedList模拟栈数据结构的集合
请用LinkedList模拟栈数据结构的集合,并测试 题目的意思是: 你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟. package cn_LinkedList; impo ...
- 【DataStructure In Python】Python模拟栈和队列
用Python模拟栈和队列主要是利用List,当然也可以使用collection的deque.以下内容为栈: #! /usr/bin/env python # DataStructure Stack ...
随机推荐
- Java实现邮箱验证码
前言 相比于java实现短信验证码,邮箱验证码就简单了许多,目前只是简单的利用java发送自定义内容至指定邮箱,等过几天再弄短信和邮箱验证码Web版本的.查询网上资料,得知相比于网易邮箱,QQ邮箱是最 ...
- 小谢第50问:vuex的五个属性-使用-介绍
一.Vuex 是什么? 官网:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 关键词:状态 ...
- Vulhub Docker环境部署
1:安装Linux 2:安装Docker : curl -s https://get.docker.com/ | sh 3:安装Docker-compose curl -s https://boots ...
- C#LeetCode刷题之#26-删除排序数组中的重复项(Remove Duplicates from Sorted Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3622 访问. 给定一个排序数组,你需要在原地删除重复出现的元素, ...
- zabbix-4.4.4安装教程(亲测可用)
1.首先添加yum源zabbix.repo [zabbix]name=zabbixbaseurl=https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/ ...
- 编写高质量代码的50条黄金守则-Day 02(首选readonly而不是const)
编写高质量代码的50条黄金守则-Day 02(首选readonly而不是const),本文由比特飞原创发布,转载务必在文章开头附带链接:https://www.byteflying.com/archi ...
- 浏览器自动化的一些体会2 webBrowser控件之ajax
上个帖子简要讨论了浏览器自动化的几种方法.现在讨论webBrowser控件使用中的一些问题.基本的操作就不详细说了,随便网上找个帖子或找本书都有介绍的.这里只写点网上似乎少有人总结过的内容,以及自己的 ...
- JavaScript设计模式之策略模式【组合委托】
前言:语言只是工具,思想才是核心 今天要总结的是 策略模式 策略在开发中的应用非常广泛,所以也是非常常见且使用的设计模式. 在实际开发中,往往在实现一个功能时,有多种解决方案可行. 常见场景: 解压: ...
- python 02 if while
1. if的格式 >>> 1<3 True 真>>> 1>3False 假 if 条件: 条件 + : (t ...
- servlet的生命周期和工作原理介绍
一.servlet生命周期 Servlet生命周期分为三个阶段: 1)初始化阶段: 调用init()方法 2)响应客户请求阶段:调用service()方法 3)终止阶段:调用destroy()方法 T ...