餐厅(数据结构与算法设计 选做题)
前言
阿邱最近开了家餐厅。阿邱想了解某一时段至少有多少不同人出入餐厅。阿邱就雇佣了一个人,呆在餐厅门口,有人进入餐厅,他就在纸上记下+,有人出餐厅,他就在纸上记下-。
假设同一时间没有两个人同时进入或出餐厅;也假设最初的时候餐厅中有足够多的人。问,这段时间里,至少有多少人出入餐厅。(不同人出入的顺序是随意的,一个人可以反复出入。)
Input
第一行是一个正整数m,表示有m组测试数据。(m<=100)
每组测试数据是一个由字符’+‘和’-'组成的字符串。字符一个接一个,之间没有其他的分隔符,字符串的长度<=200。
Output
对于每一组测试数据输出一行,最少数量的人。
提示:以下是本篇文章正文内容,下面案例可供参考
一、问题分析
可能我们做过括号匹配等类似题目,想到用栈这个数据结构去储存最少人数,但是很明显是不行的,特例是:—++±+++ 这个答案应该是 5 ,如果用stack去储存的话答案就是2 。 究其原因是因为 在某些特定案例中,比如这个案例,出出出进进进 我们最少用三个人,在来一波出进不影响,此时是三个人,但是接下来剩两个+,不能再用那三个人,因为他们三本来就已经在餐厅里了,需要额外的外面的两个人。答案就是 3 + 2 = 5 人。
经过思考,可以发现,实际答案可以是一种波动区间的取法。大致意思是记录出和入的最值,比如那个特例,前面记录得到出了3人是最值,那么从 浮标(idx) 从0 变成 -3, 然后三个人进入,这时候是 0, 然后出进 还是0;然后两个进的 就是2,记录进入的最值。 最后 2 - -3 = 5得到正确答案。
在以下代码中,plus 表示正极值 , minus 表示负极值, idx 表示游标。
二、代码实例
代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
int n, i, plus, minus, idx;
char c;
scanf("%d", &n);
getchar();
for (i = 0;i < n;i++) {
plus = minus = 0;
idx = 0;
while ((c = getchar()) != '\n') {
if (c == '+') {
idx++;
if (idx > plus)
plus = idx;
}
else {
idx--;
if (idx < minus)
minus = idx;
}
}
printf("%d\n", plus - minus);
}
}
总结
没啥总结的 哈哈