数据栈与最值栈

该博客介绍了一个仓库管理问题,其中涉及入库、出库和查询操作。通过使用两个栈来模拟仓库状态,一个栈用于存储货物数量,另一个栈用于保持最大值。在入库时,如果新货物数量大于栈顶,则更新最大值。出库时,若栈不为空,移除栈顶元素。查询操作则返回最大值栈的栈顶元素。样例输入和输出展示了算法的正确性,并给出了时间与内存限制。
摘要由CSDN通过智能技术生成

题目描述

​ 某仓库购入新的货物(每次购入的货物均不同)并将一部分老货物发出,这个过程会有软件对数据以日志形式保存,规则如下:

​ 该日志记录了两类操作:第一类操作为入库操作,以及该次入库的货物数量;第二类操作为出库操作。这些记录都严格按时间顺序排列。入库和出库的规则为先进后出,即每次出库操作货物为当前在仓库里所有货物中最晚入库的货物。

​ 为了便于分析,现在加入了第三类查询操作,每次查询时,输出当前仓库数量最多的货物的数量。


输入

​ 包含 N+1N+1 行:

​ 第一行为 11 个正整数 NN,对应于日志内所含操作的总数。

​ 接下来的 NN 行,分别属于以下三种格式之一:

​ 格式 1: 0 X //一次入库操作,正整数 XX 表示该次入库的货物的数量

​ 格式 2: 1 //一次出库操作,(就当时而言)最后入库的货物出库

​ 格式 3: 2 //一次查询操作,要求分析程序输出当前仓库内数量最多的货物的数量

​ 当仓库为空时你应该忽略出库操作,当仓库为空查询时你应该输出 00。

​ 初始时仓库状态为空。

输出

​ 输出行数等于日志中查询操作的次数。每行为一个正整数,表示查询结果。


样例输入

13
0 1
0 2
2
0 4
0 2
2
1
2
1
1
2
1
2

样例输出

2
4
4
1
0

数据规模与约定

​ 时间限制:1 s

​ 内存限制:256 M

​ 100% 的数据保证 N≤200000,X≤108

思路:一个栈模拟入库出库,另一个栈保存最值,新入库货物数量比栈顶大就入库,否则不入,维护栈顶为最大值,出库时判断最大值是否pop()掉。

#include <iostream>
#include <algorithm>
#include <stack> 
#include <cstdio>
using namespace std;
stack<int> a;
stack<int> b;
int main(){
	int n;cin>>n;
	int top=0;
	while(n--){
		int op;cin>>op;
		if(op==0){
			int t;cin>>t;
			a.push(t);
			if(b.empty()){
				b.push(t);
			}else if(b.top() <= t){
				b.push(t);
			}
		}else if(op==1){
			int t;
			if(!a.empty()){
				t=a.top();
				a.pop();
			}
			if(!b.empty() && t == b.top()){
				b.pop();
			}
		}else if(op==2){
			if(b.empty())cout<<0<<endl;
			else cout<< b.top() <<endl;
		}
	}
	return 0;
}

题目传送门:http://oj.haizeix.com/training-ground/10/problem/379

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值