1057 Stack (30 分)【stack模拟+二分】

35 篇文章 0 订阅
21 篇文章 0 订阅

1057 Stack (30 分)

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.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤10​5​​). 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 10​5​​.

Output Specification:

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.

Sample Input:

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

Sample Output:

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

题意:就是模拟堆栈,不同的是我们还要打印出中间值

解题思路:中间值用二分法处理,要不然会超时~~~,其他模拟的部分可以用stack或者vector,我这里没有直接用stack,用的是vector,一开始是超时的,后面百度了大部分都没有用柳婼学姐的树状数组,我也看不懂,还是用二分法维持一下简单点。首先是用mutilset<int>s1,s2,这个set默认是按照从小到大的排序,我们将小于等于mid的值放在s1中,大于放在s2中,然后我们做每一次的插入和删除都要调整s1,s2,也就是要保证s1的size等于s2的size或者s2size加1;遇到要取中间值就直接打印出mid值

 

#include<bits/stdc++.h>
using namespace std;
//char p[15];
string p;
vector<int>v,v1;
multiset<int>s1,s2;
int mid;
void adjust()
{
	multiset<int>::iterator it;
	if(s1.size()<s2.size())
	{
		it=s2.begin();
		s1.insert(*it);
		s2.erase(it);
	}
	if(s1.size()>s2.size()+1)
	{
	    it=s1.end();
	    it--;
		s2.insert(*it);
		s1.erase(it);
	}
	if(!s1.empty())
	{
	    it=s1.end();
	    it--;
		mid=*it;
		
	}
	
}
int main(void)
{
	int n,va;
	scanf("%d",&n);getchar();
    while(n--)
	{
		//scanf("%s",p);
		cin>>p;
		if(p=="Pop")
		{
			int len=v.size();
			if(len==0) printf("Invalid\n");
			else 
			{
				int a=v[len-1];
				printf("%d\n",a);
				v.pop_back();
				if(a<=mid)
				{
					s1.erase(s1.find(a));
				}
				else s2.erase(s2.find(a));
				adjust();
			}
		}
		else if(p=="PeekMedian")	
		{
			int len=v.size();
			if(len==0) printf("Invalid\n");
			else 
			{
				printf("%d\n",mid);
			}
		}
		else 
		{
			getchar();
			scanf("%d",&va);
			v.push_back(va);
			if(s1.empty()) s1.insert(va);
			else if(va<=mid) s1.insert(va);
			else s2.insert(va);
			adjust();
		 }
		 
	}	
	return 0;
} 

 

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
全国计算机二级JAVA笔试模拟题算法和数据结构、程序设计基础全文共21页,当前为第1页。全国计算机二级JAVA笔试模拟题算法和数据结构、程序设计基础全文共21页,当前为第1页。二级JAVA笔试模拟题算法和数据结构、程序设计基础 全国计算机二级JAVA笔试模拟题算法和数据结构、程序设计基础全文共21页,当前为第1页。 全国计算机二级JAVA笔试模拟题算法和数据结构、程序设计基础全文共21页,当前为第1页。 一、选择题 1. 下列关于栈叙述正确的是______。 A.栈顶元素最先被删除 B.栈顶元素最后才能被删除 C.栈底元素永远不能被删除 D.以上三种说法部不对 答案:A 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(Top),另一端为栈底(Bottom);栈底固定,而栈顶浮动;栈中元素个数为0时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。 2. 下列叙述中正确的是______。 A.有一个以上根节点的数据结构不一定是非线性结构 B.只有一个根节点的数据结构不一定是线性结构 C.循环链表是非线性结构 D.双向链表是非线性结构 答案:B 循环链表是另一种形式的链式存储结构。它的特点是表中最后一个节点的指针全国计算机二级JAVA笔试模拟题算法和数据结构、程序设计基础全文共21页,当前为第2页。全国计算机二级JAVA笔试模拟题算法和数据结构、程序设计基础全文共21页,当前为第2页。域指向头节点,整个链表形成一个环。双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,别指向直接后继和直接前驱。所以,从双向链表中的任意一个节点开始,都可以很方便地访问它的前驱节点和后继节点;循环链表和双向链表都是线性结构。有一个以上根节点的结构一定是非线性结构。 3. 某二叉树共有7个节点,其中叶子节点只有1个,则该二叉树的深度为______(假设根节点在第1层)。 A.3 B.4 C.6 D.7 答案:D 二叉树是一种很有用的非线性结构,它具有以下两个特点: 1)非空二叉树只有一个根节点; 2)每一个节点最多有两棵子树,且别称为该节点的左子树与右子树。 根据二叉树的概念可知,二叉树的度可以为0(叶子节点)、1(只有一棵子树)或2(有2棵子树)。由于只有一个叶子节点,所以该二叉树没有叉,7个节点连成一线,深度为7。 4. 下列叙述正确的是______。 A.算法就是程序 B.设计算法时只需要考虑数据结构的设计 C.设计算法时只需要考虑结果的可靠性 D.以上三种说法都不对 全国计算机二级JAVA笔试模拟题算法和数据结构、程序设计基础全文共21页,当前为第3页。全国计算机二级JAVA笔试模拟题算法和数据结构、程序设计基础全文共21页,当前为第3页。 答案:D 算法是求解问题的方法。程序设计时要设计算法,但算法不是程序。设计算法除了要考虑数据结构外,还要考虑算法的可行性、可靠性等。 5. 下列关于线性链表的叙述中,正确的是______。 A.各数据节点的存储空间可以不连续,但它们的存储顺序与逻辑顺序必须一致 B.各数据节点的存储顺序与逻辑顺序可以不一致,但它们的存储空间必须连续 C.进行插入与删除时,不需要移动表中的元素 D.以上三种说法都不对 答案:C 节点的存储顺序和逻辑顺序不一定一致,存储空间也不一定连续。插入和删除元素的时候,不需要移动表中的元素。 6. 下列关于二叉树的叙述中,正确的是______。 A.叶子节点总是比度为2的节点少一个 B.叶子节点总是比度为2的节点多一个 C.叶子节点数是度为2的节点数的两倍 D.度为2的节点数是度为1的节点数的两倍 答案:B 全国计算机二级JAVA笔试模拟题算法和数据结构、程序设计基础全文共21页,当前为第4页。全国计算机二级JAVA笔试模拟题算法和数据结构、程序设计基础全文共21页,当前为第4页。 二叉树叶子节点总是比度为2的节点多一个,这是二叉树的性质。 7. 下列叙述中正确的是______。 A.栈是一种先进先出的线性表 B.队列是一种后进先出的线性表 C.栈与队列都是非线性结构 D.以上三种说法都不对 答案:D 栈和队列都是特殊的线性表,栈(Stack)只能在表的一端进行插入和删除运算,所以,栈是一种"先进后出"的线性表;而队列(Queue)只允许在一端删除,在另一端插入,所以,队列是一种"先进先出"的线性表。 8. 一棵二叉树共有25个节点,其中5个是叶子节点,则度为1的节点数为______。 A.4 B.10 C.6 D.16 答案:D 从题干中我们知道,在该二叉树中有5个叶子节点,由二叉树的性质之一:任何一棵二叉树,度为0的节点(也就是叶子节点)总是比度为

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值