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 ...
随机推荐
- 你不是说你会Aop吗?
一大早,小王就急匆匆的跑过来找我,说:周哥,那个记录日志的功能我想请教一下. 因为公司某个项目要跟别的平台做对接,我们这边需要给他们提供一套接口.昨天,我就将记录接口日志的工作安排给了小王. 下面是我 ...
- Android RecyclerView的补充。
明天写吧.. 今天写,然后再写今天的内容,虽然结课了,我们还是得学习,所以如果我学习了一些知识,不出意外每天会持续更新的. RecyclerView其实是可以完全代替ListView的存在, 但是为啥 ...
- boost之signal的使用
文章目录 简介 代码 模板实现: 测试代码 运行结果 简介 boost是C++的一个扩展库,被称为C++准标准库,里面的组件很丰富,并且引用方便,85%的组件只需要引用头文件即可使用. 并且在嵌入式系 ...
- 极简 Node.js 入门 - 1.2 模块系统
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...
- 解决 SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp的问题
连接数据库时 设置:zeroDateTimeBehavior=convertToNull
- @RequestMapping 参数详解
引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为applicatio ...
- 【av68676164(p55-p58)】 Intel CPU和Linux内存管理
7.4.1 Intel CPU物理结构 https://www.cnblogs.com/megachen/p/9768115.html x86实模式 实模式 20位:1M内存空间 地址表示方式:段地址 ...
- C#LeetCode刷题之#697-数组的度( Degree of an Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3738 访问. 给定一个非空且只包含非负数的整数数组 nums, ...
- CSS动画实例:一颗躁动的心
在页面中放置一个类名为container的层作为盛放心心的容器,在该层中再定义一个名为heart的子层,HTML代码描述如下: <div class="container"& ...
- Linux域名服务器部署
环境:vmware workstation 系统:Red Hat7.4 DNS服务部署: IP地址:192.168.100.151 DNS:192.168.100.15 ...