题目描述:
M 海运公司最近要对旗下仓库的货物进出情况进行统计。目前他们所拥有的唯一记录就是一个记录集装箱进出情况的日志。该日志记录了两类操作:第一类操作为集装箱入库操作,以及该次入库的集装箱重量;第二类操作为集装箱的出库操作。这些记录都严格按时间顺序排列。集装箱入库和出库的规则为先进后出,即每次出库操作出库的集装箱为当前在仓库里所有集装箱中最晚入库的集装箱。
出于分析目的,分析人员在日志中随机插入了若干第三类操作――查询操作。分析日志时,每遇到一次查询操作,都要报告出当前仓库中最大集装箱的重量。
CSDN显示可能有问题,不允许外链转存,大家可以在我的博客中阅读:My Blog
思路解析
首先我们知道要使用一个栈来存储输入的重量,但是由于这里有着一个所谓的最大值的限制,我们要能随时查询最大值,所以同时还需要有着一个辅助栈来同步存储我们的当前元素作为栈顶时的最大值,这个是建立栈的同时建立的辅助栈,最后我们只需要查询时输出栈顶,出库时把两个栈顶都弹出来就行。
另外就是注意一下这里的空栈时查询输出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;
}