算法刷题之栈系列P1165-日志分析

题目描述:

M 海运公司最近要对旗下仓库的货物进出情况进行统计。目前他们所拥有的唯一记录就是一个记录集装箱进出情况的日志。该日志记录了两类操作:第一类操作为集装箱入库操作,以及该次入库的集装箱重量;第二类操作为集装箱的出库操作。这些记录都严格按时间顺序排列。集装箱入库和出库的规则为先进后出,即每次出库操作出库的集装箱为当前在仓库里所有集装箱中最晚入库的集装箱。

出于分析目的,分析人员在日志中随机插入了若干第三类操作――查询操作。分析日志时,每遇到一次查询操作,都要报告出当前仓库中最大集装箱的重量。

CSDN显示可能有问题,不允许外链转存,大家可以在我的博客中阅读:My Blog

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eYkBY8uQ-1628094465702)(https://z3.ax1x.com/2021/08/04/fEvvCD.png)]

思路解析


首先我们知道要使用一个栈来存储输入的重量,但是由于这里有着一个所谓的最大值的限制,我们要能随时查询最大值,所以同时还需要有着一个辅助栈来同步存储我们的当前元素作为栈顶时的最大值,这个是建立栈的同时建立的辅助栈,最后我们只需要查询时输出栈顶,出库时把两个栈顶都弹出来就行。

另外就是注意一下这里的空栈时查询输出0就行了

代码


#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>


// 一共需要两个栈,一个栈用来记录依次进入的货品质量,
//一个栈在建立前一个栈的时候记录当前栈的最大值

int stack1[200006];  // 记录依次进入的货品质量
int stack2[200006];  // 记录建立栈的同时当前栈的最大值

int main()
{
	int n; // 所含操作总数
	int opera; // 记录每次的操作
	int weigh; // 记录每次的物品质量
	int top = 0; //记录栈顶位置

	scanf("%d", &n);  //读取数据
	
	//scanf("%d%d", &opera, &weigh);  // 先读取一次,使栈中有数
	//stack1[top++] = weigh;
	//stack2[top++] = weigh;  // 由于栈中只有一个元素,所以我们的当前栈最大值为weigh



	for (int i = 0; i < n; i++)  // 循环n次
	{
		scanf("%d", &opera);
		switch (opera)
		{
		case 0:   // 读取入栈
		{
			scanf("%d", &weigh);
			stack1[top++] = weigh;  // 入栈

			if (top == 1)   //栈中只有一个元素
				stack2[top - 1] = weigh;
			else if (weigh > stack2[top - 2])  // 如果我们的读入数据比之前的最大值还大
				stack2[top - 1] = weigh;   // 就更改最大值
			else
				stack2[top - 1] = stack2[top - 2];  // 否则延续上次的最大值
			break;
		}
		case 1:  //出库
		{
			if (top != 0)  //如果栈不空
				top--;   // 出栈
			break;

		}
		case 2: // 如果栈
		{
			if (top == 0)  // 栈空时输出0
				printf("0\n");
			else
				printf("%d\n", stack2[top - 1]);
		}
		default:
			break;
		}
	}

	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值