餐厅(数据结构与算法设计 选做题)

餐厅(数据结构与算法设计 选做题)


前言

阿邱最近开了家餐厅。阿邱想了解某一时段至少有多少不同人出入餐厅。阿邱就雇佣了一个人,呆在餐厅门口,有人进入餐厅,他就在纸上记下+,有人出餐厅,他就在纸上记下-。

假设同一时间没有两个人同时进入或出餐厅;也假设最初的时候餐厅中有足够多的人。问,这段时间里,至少有多少人出入餐厅。(不同人出入的顺序是随意的,一个人可以反复出入。)

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);
	}
}

总结

没啥总结的 哈哈

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值